41. Quartz Scheduler by ys

Quartz Scheduler 는 거의 모든 Java 응용 프로그램에 통합 할 수 있는 풍부한 기능의 오픈 소스 작업 스케줄 라이브러리입니다.

[스프링에서 Unix의 Cron 처럼 특정시간 혹은 몇분 혹은 몇시간마다 동작해는 스케쥴러를 구현해야 했다.

그래서 찾아보게 된게 Spring + Quartz Scheduler 조합의 활용이었다.

하지만 Spring 3.1 버전 부터는 Quartz Scheduler를 사용하지 않고도 Scheduler를 통한 Job을 실행할 수 있게 되었다.]

출처: http://javafactory.tistory.com/1386 [FreeLife의 저장소]

위와 같은 글을 보았습니다. 위 말 처럼 우리는 이미 Spring Framework 안에서 @Scheduled 를 통해 과거 Quartz 에서 제공해주었던 cron schedule 기능 등을 사용하고 있는 것 입니다.

https://blog.kingbbode.com/posts/spring-batch-quartz

Spring Boot는 spring-boot-starter-quartz "Starter"를 포함하여 Quartz 스케줄러 를 사용하기위한 몇 가지 편의를 제공합니다. Quartz가 사용 가능하다면, Scheduler가 자동으로 구성 됩니다.( SchedulerFactoryBean추상화를 통해)

다음 유형의 BEan은 자동으로 선택되어 Scheduler와 연관됩니다.

  • JobDetail: 특정 작업을 정의합니다. JobDetail인스턴스는 JobBuilderAPI 로 빌드 될 수 있습니다 .

  • Calendar.

  • Trigger: 특정 작업이 트리거되는시기를 정의합니다.

기본적으로 인 메모리 JobStore가 사용됩니다. 그러나 응용 프로그램에서 DataSourcebean을 사용할 수 있고 다음 예제와 같이 spring.quartz.job-store-type 속성이 적절 하게 구성된 경우 JDBC 기반 저장소를 구성 할 수 있습니다 .

spring.quartz.job-store-type = jdbc

JDBC 저장소를 사용하면 다음 예와 같이 시작할 때 스키마를 초기화 할 수 있습니다.

spring.quartz.jdbc.initialize-schema = always

기본적으로 Quartz 라이브러리와 함께 제공되는 표준 스크립트를 사용하여 데이터베이스를 검색하고 초기화합니다. 이 스크립트는 기존 테이블을 삭제하고 다시 시작할 때마다 모든 트리거를 삭제합니다. 또한 spring.quartz.jdbc.schema속성 을 설정하여 사용자 정의 스크립트를 제공 할 수도 있습니다 .

Quartz가 애플리케이션의 main DataSource가 아닌 다른 DataSource을 사용하게하려면 , DataSourcebean을 선언하고 , 그 @Bean메소드에 @QuartzDataSource주석을 달아라. 이렇게하면 Quartz 특정 DataSourceSchedulerFactoryBean 및 스키마 초기화에 모두 사용됩니다.

기본적으로 구성으로 생성 된 작업은 영구 작업 저장소에서 읽은 이미 등록 된 작업을 덮어 쓰지 않습니다. 기존 작업 정의를 덮어 쓰려면 해당 spring.quartz.overwrite-existing-jobs속성을 설정하십시오 .

Quartz Scheduler 설정은 프로그래밍 방식의 커스터마이즈가 가능한 spring.quartz속성과 SchedulerFactoryBeanCustomizer빈을 사용하여 SchedulerFactoryBean을 사용자 정의 할 수 있습니다. advanced Quartz 구성 속성은 spring.quartz.properties.*을 사용하여 사용자 정의 할 수 있습니다 .

특히, Quartz는 스케줄러를 spring.quartz.properties통해 구성 할 수있는 방법을 제공하므로 ExecutorBean은 스케줄러와 연관되지 않는다. 태스크 실행 프로그램을 사용자 정의해야하는 경우 SchedulerFactoryBeanCustomizer구현을 고려하십시오.

Jobs은 데이터 맵 속성을 삽입하는 setter를 정의 할 수 있습니다. 다음 예제와 같이 일반 bean도 유사한 식으로 주입 할 수 있습니다.

public class SampleJob extends QuartzJobBean {

	private MyService myService;

	private String name;

	// Inject "MyService" bean
	public void setMyService(MyService myService) { ... }

	// Inject the "name" job data property
	public void setName(String name) { ... }

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		...
	}

}

Last updated