Quartz スケジューラー

Spring Boot は、spring-boot-starter-quartz スターターを含む、Quartz スケジューラー (英語) を操作するためのいくつかの便利な機能を提供します。Quartz が使用可能な場合、Scheduler (英語) は自動的に構成されます (SchedulerFactoryBean (Javadoc) 抽象化を通じて)。

次の型の Bean が自動的に選択され、Scheduler (英語) に関連付けられます。

デフォルトでは、メモリ内の JobStore (英語) が使用されます。ただし、次の例に示すように、アプリケーションで DataSource (標準 Javadoc) Bean が使用可能であり、spring.quartz.job-store-type プロパティがそれに応じて構成されている場合は、JDBC ベースのストアを構成できます。

  • プロパティ

  • YAML

spring.quartz.job-store-type=jdbc
spring:
  quartz:
    job-store-type: "jdbc"

JDBC ストアを使用すると、次の例に示すように、起動時にスキーマを初期化できます。

  • プロパティ

  • YAML

spring.quartz.jdbc.initialize-schema=always
spring:
  quartz:
    jdbc:
      initialize-schema: "always"
デフォルトでは、Quartz ライブラリで提供される標準スクリプトを使用して、データベースが検出および初期化されます。これらのスクリプトは既存のテーブルを削除し、再起動するたびにすべてのトリガーを削除します。spring.quartz.jdbc.schema プロパティを設定して、カスタムスクリプトを提供することもできます。

Quartz がアプリケーションのメイン DataSource (標準 Javadoc) 以外の DataSource (標準 Javadoc) を使用するようにするには、DataSource (標準 Javadoc) Bean を宣言し、その @Bean (Javadoc) メソッドに @QuartzDataSource (Javadoc) のアノテーションを付けます。これにより、Quartz 固有の DataSource (標準 Javadoc) SchedulerFactoryBean (Javadoc) とスキーマ初期化の両方で使用されるようになります。同様に、Quartz がアプリケーションのメイン TransactionManager (Javadoc) 以外の TransactionManager (Javadoc) を使用するようにするには、TransactionManager (Javadoc) Bean を宣言し、その @Bean (Javadoc) メソッドに @QuartzTransactionManager (Javadoc) のアノテーションを付けます。

デフォルトでは、構成によって作成されたジョブは、永続ジョブストアから読み取られた登録済みのジョブを上書きしません。既存のジョブ定義の上書きを有効にするには、spring.quartz.overwrite-existing-jobs プロパティを設定します。

Quartz スケジューラ構成は、プログラムによる SchedulerFactoryBean (Javadoc) のカスタマイズを可能にする spring.quartz プロパティと SchedulerFactoryBeanCustomizer (Javadoc) Bean を使用してカスタマイズできます。高度な Quartz 構成プロパティは、spring.quartz.properties.* を使用してカスタマイズできます。

特に、Quartz は spring.quartz.properties を介してスケジューラを構成する方法を提供するため、Executor (標準 Javadoc) Bean はスケジューラに関連付けられていません。タスクエグゼキュータをカスタマイズする必要がある場合は、SchedulerFactoryBeanCustomizer (Javadoc) の実装を検討してください。

ジョブは、setter を定義してデータマッププロパティを挿入できます。次の例に示すように、通常の Bean も同様の方法で注入できます。

  • Java

  • Kotlin

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean;

public class MySampleJob extends QuartzJobBean {

	// fields ...

	private MyService myService;

	private String name;


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

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

	@Override
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		this.myService.someMethod(context.getFireTime(), this.name);
	}

}
import org.quartz.JobExecutionContext
import org.springframework.scheduling.quartz.QuartzJobBean

class MySampleJob : QuartzJobBean() {

	// fields ...

	private var myService: MyService? = null

	private var name: String? = null

	// Inject "MyService" bean
	fun setMyService(myService: MyService?) {
		this.myService = myService
	}

	// Inject the "name" job data property
	fun setName(name: String?) {
		this.name = name
	}

	override fun executeInternal(context: JobExecutionContext) {
		myService!!.someMethod(context.fireTime, name)
	}

}