# 41. Quartz Scheduler by ys

{% hint style="info" %}
[Quartz Scheduler](http://www.quartz-scheduler.org/) 는 거의 모든 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](https://blog.kingbbode.com/posts/spring-batch-quartz)
{% endhint %}

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

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

* `JobDetail`: 특정 작업을 정의합니다. `JobDetail`인스턴스는 `JobBuilder`API 로 빌드 될 수 있습니다 .
* `Calendar`.
* `Trigger`: 특정 작업이 트리거되는시기를 정의합니다.

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

```
spring.quartz.job-store-type = jdbc
```

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

```
spring.quartz.jdbc.initialize-schema = always
```

| ![\[경고\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/warning.png)                                                                                |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 기본적으로 Quartz 라이브러리와 함께 제공되는 표준 스크립트를 사용하여 데이터베이스를 검색하고 초기화합니다. 이 스크립트는 기존 테이블을 삭제하고 다시 시작할 때마다 모든 트리거를 삭제합니다. 또한 `spring.quartz.jdbc.schema`속성 을 설정하여 사용자 정의 스크립트를 제공 할 수도 있습니다 . |

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

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

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

| ![\[노트\]](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/images/note.png)                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 특히, Quartz는 스케줄러를  `spring.quartz.properties`통해 구성 할 수있는 방법을 제공하므로 `Executor`Bean은 스케줄러와 연관되지 않는다. 태스크 실행 프로그램을 사용자 정의해야하는 경우 `SchedulerFactoryBeanCustomizer`구현을 고려하십시오. |

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

```java
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 {
		...
	}

}

```

### &#x20;
