Quartz スケジューラー
Spring Boot は、spring-boot-starter-quartz
スターターを含む、Quartz スケジューラー (英語) を操作するためのいくつかの便利な機能を提供します。Quartz が使用可能な場合、Scheduler
(英語) は自動的に構成されます (SchedulerFactoryBean
(Javadoc) 抽象化を通じて)。
次の型の Bean が自動的に選択され、Scheduler
(英語) に関連付けられます。
JobDetail
(英語) : 特定のジョブを定義します。JobDetail
(英語) インスタンスはJobBuilder
(英語) API を使用して構築できます。Trigger
(英語) : 特定のジョブがいつトリガーされるかを定義します。
デフォルトでは、メモリ内の 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)
}
}