# 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>
{% 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 {
		...
	}

}

```

### <br>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wannaqueen.gitbook.io/spring5/spring-boot/undefined-1/41.-quartz-scheduler.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
