봄 부팅 및 작업 시간 초과 알림 석영을 달성

우리의 제품은 도구 (제품명 빛의 흐름), 고객은 종종 이러한 요구를 개진을 구축하기위한 코드가없는 비즈니스 프로세스입니다 :

"시간에 작업이 노드가 처리하지 않는 경우 때문에 우리는, 각 노드를 더한 시간 제한을 검토, 컨트롤에 일정을 만들기 위해 다음 시간 제한을 원한다!"

"시간은 시간 제한 작업을 접근 할 때, 가벼운 스트림 기능을이 작업을 담당하는 사람을 생각 나게 할 수없는 제한된 작업에 더 중요한 일입니까?"

......

가시성, 적시성 작업은 우리가이 목표 "사람들을 생각 나게하는 노드를 이동하는 일정 시간"을 달성하는 방법, 매우 중요한 일이?

우리는 알고, 봄 부팅 스케줄링 기능이 있습니다 노트 @Schedule 일반 작업을 달성 할 수 있지만,이 방법은 고정 된 시간 일정을 달성 할 수있다. 사용자의 필요 사용자 정의 작업 시작 시간 타이밍됩니다. 시스템을 다시 시작할 경우 중요한 것은, 다음 작업을 타이밍 원래 메모리는 해제됩니다! 이것은 심각한 문제입니다.

이번에는 석영이 도구는 유용합니다.

석영 (오픈 소스 조직의 기여 덕분에) 좋은 오픈 소스 스케줄링 프레임 워크, 그것은 다음과 같은 많은 장점을 가지고 있습니다 :

(1)의 강력한 지지체 다양한 스케줄링 방법 및 동시에 스케쥴링 타이밍 된 태스크 수천 지원;

(2) 작업 예약하기 전에 "잊지"다시 부팅 후 시스템에 대해 걱정하지 마십시오, 임무는 계속 지원;

(3) 지원 당신은 (린킨 오픈 소스 예약 도구 아즈카반는 석영 기반으로 구현됩니다) 작업 스케줄링,로드 밸런싱을 수행하고 신뢰성을 향상시키기 위해 다수의 집행을 설정 할 수 있습니다 분산.

석영 핵심 개념

석영은 몇 가지 핵심 개념이있다 :

스케줄러 : 작업 스케줄러

트리거 : 예약 된 시간의 규칙을 정의 트리거,

작업 : 작업 스케줄러 일정 작업 즉,

키 : 이름 (이름) 및 그룹 (그룹)을 포함 할 때, 우리가 작업을 트리거 스케줄러에 등록, 당신은 그들에게 키를 할당해야합니다.

같이 관계의 석영 핵심 개념 :

봄 부팅 및 작업 시간 초과 알림 석영을 달성

(출처 : IBM)

작업 과정의 구성 요소 :

(1) 스케줄러 인스턴스 SchedulerFactory를 사용하여 생성된다

SchedulerFactory 공장 = 새로운 SchedulerFactory ();
스케줄러 스케줄러 = factory.getScheduler ();
(2)创建一个任务

작업 = JobBuilder.newJob하기 JobDetail (CustomJob.class) .withIndentity ( "myjob", "MyGroup을") 빌드 ();
작업 클래스 타임 CustomJob 사용자 정의입니다.

(3) 어떤 시간에 작업 실행에 지정 트리거를 만들

트리거 = TriggerBuilder.newTrigger.withIndentity 트리거 ( "myTrigger", "MyGroup을")
.startAt (targerDate) .build ()
, TargetDate은 java.util.Date 유형입니다, 작업을 수행하기 위해 어떤 시간에 지정하는 데 사용됩니다.

(4) 작업 스케줄러에 가입

scheduler.scheduleJob (작업, 트리거)
작업 예약까지 후이 작업은 지정된 시간 친구에서 실행됩니다.

봄 부팅에서

앞서 우리는 단지 그 다음 어떻게에서 봄 부팅을 사용하려면, 석영 기본 워크 플로우를 도입? 의 일반 작업은 어떻게 유지 하는가?

봄 부트 버전 2.0에서는 석영을 2.3.0 버전이 통합되어, 봄 부팅은 개발 압력 프로그래머를 감소, 수동 작업을 많이 제거, 석영의 구성을 자동화 할 수있다

봄 부팅에서 기존 프로젝트 (1) Gradle을 파일 석영 스타터 따라 도입

컴파일 ( 'org.springframework.boot : 봄 - 부팅 스타터 - 석영이')
(2) 테이블을 만드는 데 필요한 데이터 소스에 MySQL의 항목에 해당하는 석영 SQL 문에 지정된 (텍스트 코드의 끝을 참조)

(3) 추가 석영 application.properties에 배치

= 유형 스토어 - spring.quartz.job의 JDBC의의
spring.quartz.jdbc.initialize - 스키마 = 절대
또한, 우리는 다른 구성을 쓰지 않는다, 봄 부팅이 자동으로 우리를 위해 구성.

이 구성 후 모든 수정 작업은 자동으로 손실되지 않습니다,의 MySQL의에 유지됩니다.

(4) 작업 예약 코드

우리가 직접 분사 스케줄러 스케줄러를 사용하는 데 필요한 // 곳, 봄 부팅 구성되었습니다

스케줄러 예

@Autowire
개인 스케줄러 스케줄러;
// 작업 예약
문자열 JobKey = UUID.randomUUID의 toString () ();
문자열 triggerKey = UUID.randomUUID의 toString () ();
만약 JobDetail하기 JobDetail = JobBuilder.newJob (CustomNotifyTask.class)
.withIdentity ( JobKey는 CustomTask.class.getName ())
.build ();
트리거 트리거 TriggerBuilder.newTrigger = ()
.withIdentity (triggerKey, CustomTask.class.getName ())
.startAt (targetdate) .build ()는,
스케줄링을 시작 //
scheduler.scheduleJob (만약 JobDetail, 트리거)
CustomTask 작업은 executeInternal QuartzJobBean 상속과 인터페이스를 구현하는 클래스입니다.

는 CustomTask QuartzJobBean {클래스 공공 확장 /> @ 재정의 BR
무효 executeInternal (JobExecutionContext를 컨텍스트)를 보호 {
;에서 System.out.println ( "안녕하세요")가
}
}
따라서, 우리는 하나의 연속 석영 노드 스케줄러의 사용을 보여줍니다.

보너스 : 일반 작업에 패스 매개 변수
일반적으로는, 다양한 기능을 달성하기 위해, 정기적 인 작업 매개 변수를받을 필요가있다. 예를 들어, 우리는 전자 메일 주소가 매개 변수에 전달되는 사서함 사용자 정의 타이밍 작업에 메시지를 보내려고합니다.

석영의 틀에서, 타이머 작업에 매개 변수를 전달하는 것은 매우 편리합니다.

작업을 예약 할 때, 매개 변수 myNumber를 전달합니다.

만약 JobDetail = JobBuilder.newJob하기 JobDetail (CustomNotifyTask.class)
.withIdentity (JobKey, CustomTask.class.getName ())
.usingJobData ( "myNum에"는 myNumber)
.usingJobData ( "이메일"이메일)
.build ();
수행 과제 myNumber 파라미터를 구하는 경우.

@Override
보호 executeInternal (JobExecutionContext를 컨텍스트) {공극
JobDataMap 데이터 맵 context.getJobDetail = () getJobDataMap ().;
정수 applyId = dataMap.getInt ( "myNum에");
문자열 이메일 = dataMap.getInt ( "이메일");
// .......
}

확장 : 석영 클러스터

개별 석영 스케줄러 인스턴스 (독립 실행 형 버전)을 수 있지만 우리는 작업 스케줄링을위한 아주 좋은,하지만 같은 신뢰성, 가용성 및 확장 성 등 엔터프라이즈 애플리케이션의 점점 더 복잡한 요구 사항을 충족 할 수 없다. 우리 다중 작업 스케줄링 경우, 석영 클러스터는 고려되어야 그 다음이다. 때 충돌 석영 인스턴스를 클러스터의 다른 인스턴스를 신속하게 작업의 이행을 보장하기 위해 일 이상 걸릴 수 있습니다.

석영 클러스터 구성에 관심 있다면, 같은 https://medium.com/@Hronom/spring-boot-quartz-scheduler-in-cluster-mode-457f4535104d,Quartz 등 추가 기능의 장소가 될 수있다, 다소 복잡하다 에 대한 당신 탐험!

추천

출처blog.51cto.com/14502444/2429860