public class SchedulerFactoryBean extends SchedulerAccessor implements FactoryBean<Scheduler>, BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean, SmartLifecycle
Scheduler
を作成および構成し、そのライフサイクルを Spring アプリケーションコンテキストの一部として管理し、依存性注入のための Bean 参照としてスケジューラを公開する FactoryBean
。JobDetails、カレンダー、トリガーの登録を可能にし、初期化時にスケジューラーを自動的に開始し、破棄時にスケジューラーをシャットダウンします。起動時にジョブの静的登録のみが必要なシナリオでは、アプリケーションコードでスケジューラインスタンス自体にアクセスする必要はありません。
実行時にジョブを動的に登録するには、この SchedulerFactoryBean への Bean 参照を使用して、Quartz スケジューラ(org.quartz.Scheduler
)に直接アクセスします。これにより、新しいジョブとトリガーを作成したり、スケジューラ全体を制御および監視したりできます。
繰り返し実行間で共有される TimerTask インスタンスを使用するタイマーとは対照的に、Quartz は実行ごとに新しいジョブをインスタンス化することに注意してください。JobDetail 記述子のみが共有されます。
永続的なジョブを使用する場合は、Spring で管理された(またはプレーンな JTA)トランザクション内でスケジューラのすべての操作を実行することを強くお勧めします。そうでなければ、データベースのロックは適切に機能せず、壊れる可能性さえあります。(詳細については、setDataSource
javadoc を参照してください。)
トランザクション実行を実現するための推奨される方法は、ビジネスファサードレベルで宣言型トランザクションの境界を定めることです。これは、これらのスコープ内で実行されるスケジューラー操作に自動的に適用されます。または、スケジューラ自体にトランザクションアドバイスを追加することもできます。
Spring 4.1 の時点で、Quartz 2.1.4 以降と互換性があります。
setDataSource(javax.sql.DataSource)
, Scheduler
, SchedulerFactory
, StdSchedulerFactory
, TransactionProxyFactoryBean
修飾子と型 | フィールドと説明 |
---|---|
static int | DEFAULT_THREAD_COUNT デフォルトのスレッド数。 |
static StringSE | PROP_THREAD_COUNT スレッド数プロパティ。 |
logger, resourceLoader
OBJECT_TYPE_ATTRIBUTE
DEFAULT_PHASE
コンストラクターと説明 |
---|
SchedulerFactoryBean() |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() |
protected Scheduler | createScheduler(SchedulerFactory schedulerFactory, StringSE schedulerName) 指定されたファクトリとスケジューラー名のスケジューラーインスタンスを作成します。 |
void | destroy() Bean ファクトリシャットダウン時に Quartz スケジューラをシャットダウンし、スケジュールされたすべてのジョブを停止します。 |
static DataSourceSE | getConfigTimeDataSource() LocalDataSourceJobStore で使用される、現在構成されている Quartz スケジューラの DataSource SE を返します。 |
static DataSourceSE | getConfigTimeNonTransactionalDataSource() LocalDataSourceJobStore で使用される、現在構成されている Quartz スケジューラの非トランザクション DataSource SE を返します。 |
static ResourceLoader | getConfigTimeResourceLoader() ResourceLoaderClassLoadHelper で使用される、現在構成されている Quartz スケジューラの ResourceLoader を返します。 |
static ExecutorSE | getConfigTimeTaskExecutor() LocalTaskExecutorThreadPool で使用される、現在構成されている Quartz スケジューラの Executor SE を返します。 |
Scheduler | getObject() このファクトリによって管理されるオブジェクトのインスタンス(おそらく共有または独立)を返します。 |
ClassSE<? extends Scheduler> | getObjectType() この FactoryBean が作成するオブジェクトの型、または事前に不明な場合は null を返します。 |
int | getPhase() このスケジューラーが開始および停止されるフェーズを返します。 |
Scheduler | getScheduler() 操作するスケジューラを決定するテンプレートメソッド。 |
boolean | isAutoStartup() このスケジューラーが自動起動用に構成されているかどうかを返します。 |
boolean | isRunning() このコンポーネントが現在実行されているかどうかを確認します。 |
boolean | isSingleton() このファクトリによって管理されるオブジェクトはシングルトンですか? つまり、 FactoryBean.getObject() は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? |
void | setApplicationContext(ApplicationContext applicationContext) このオブジェクトが実行される ApplicationContext を設定します。 |
void | setApplicationContextSchedulerContextKey(StringSE applicationContextSchedulerContextKey) SchedulerContext で公開する ApplicationContext 参照のキーを設定します(例: "applicationContext" )。 |
void | setAutoStartup(boolean autoStartup) 初期化後にスケジューラーを自動的に開始するかどうかを設定します。 |
void | setBeanName(StringSE name) この Bean を作成した Bean ファクトリで Bean の名前を設定します。 |
void | setConfigLocation(Resource configLocation) Quartz プロパティ構成ファイルの場所を、たとえばクラスパスリソース "classpath:quartz.properties" として設定します。 |
void | setDataSource(DataSourceSE dataSource) スケジューラが使用するデフォルトの DataSource SE を設定します。 |
void | setExposeSchedulerInRepository(boolean exposeSchedulerInRepository) Quartz SchedulerRepository で Spring 管理の Scheduler インスタンスを公開するかどうかを設定します。 |
void | setJobFactory(JobFactory jobFactory) このスケジューラに使用する Quartz JobFactory を設定します。 |
void | setNonTransactionalDataSource(DataSourceSE nonTransactionalDataSource) 非トランザクションアクセスに使用する DataSource SE を設定します。 |
void | setPhase(int phase) このスケジューラーを開始および停止するフェーズを指定します。 |
void | setQuartzProperties(PropertiesSE quartzProperties) "org.quartz.threadPool.class" などの Quartz プロパティを設定します。 |
void | setSchedulerContextAsMap(MapSE<StringSE,?> schedulerContextAsMap) 指定されたマップを介してスケジューラコンテキストにオブジェクトを登録します。 |
void | setSchedulerFactory(SchedulerFactory schedulerFactory) 使用する外部 Quartz SchedulerFactory インスタンスを設定します。 |
void | setSchedulerFactoryClass(ClassSE<? extends SchedulerFactory> schedulerFactoryClass) 使用する Quartz SchedulerFactory 実装を設定します。 |
void | setSchedulerName(StringSE schedulerName) org.quartz.scheduler.instanceName プロパティの代わりに、SchedulerFactory を介して作成するスケジューラーの名前を設定します。 |
void | setStartupDelay(int startupDelay) 初期化後、スケジューラーを非同期で開始する前に待機する秒数を設定します。 |
void | setTaskExecutor(ExecutorSE taskExecutor) Spring 管理の Executor SE を Quartz バックエンドとして使用するように設定します。 |
void | setWaitForJobsToCompleteOnShutdown(boolean waitForJobsToCompleteOnShutdown) シャットダウン時に実行中のジョブが完了するのを待つかどうかを設定します。 |
void | start() このコンポーネントを起動します。 |
protected void | startScheduler(Scheduler scheduler, int startupDelay) "startupDelay" 設定を考慮して、Quartz スケジューラを起動します。 |
void | stop() このメソッドを返すとコンポーネントが完全に停止するように、通常は同期的にこのコンポーネントを停止します。 |
registerJobsAndTriggers, registerListeners, setCalendars, setGlobalJobListeners, setGlobalTriggerListeners, setJobDetails, setJobSchedulingDataLocation, setJobSchedulingDataLocations, setOverwriteExistingJobs, setResourceLoader, setSchedulerListeners, setTransactionManager, setTriggers
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
stop
public static final int DEFAULT_THREAD_COUNT
@Nullable public static ResourceLoader getConfigTimeResourceLoader()
ResourceLoaderClassLoadHelper
で使用される、現在構成されている Quartz スケジューラの ResourceLoader
を返します。このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
@Nullable public static ExecutorSE getConfigTimeTaskExecutor()
LocalTaskExecutorThreadPool
で使用される、現在構成されている Quartz スケジューラの Executor
SE を返します。このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
@Nullable public static DataSourceSE getConfigTimeDataSource()
LocalDataSourceJobStore
で使用される、現在構成されている Quartz スケジューラの DataSource
SE を返します。このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
@Nullable public static DataSourceSE getConfigTimeNonTransactionalDataSource()
LocalDataSourceJobStore
で使用される、現在構成されている Quartz スケジューラの非トランザクション DataSource
SE を返します。このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
public void setSchedulerFactory(SchedulerFactory schedulerFactory)
SchedulerFactory
インスタンスを設定します。 デフォルトは内部 StdSchedulerFactory
インスタンスです。このメソッドが呼び出されると、setSchedulerFactoryClass(java.lang.Class<? extends org.quartz.SchedulerFactory>)
によって指定されたクラス、および setConfigLocation(org.springframework.core.io.Resource)
、setQuartzProperties(java.util.Properties)
、setTaskExecutor(java.util.concurrent.Executor)
または setDataSource(javax.sql.DataSource)
によって指定された設定がオーバーライドされます。
注意 : 外部で提供される SchedulerFactory
インスタンスでは、setConfigLocation(org.springframework.core.io.Resource)
や setQuartzProperties(java.util.Properties)
などのローカル設定は、ここで SchedulerFactoryBean
で無視され、外部 SchedulerFactory
インスタンスが独自に初期化されることが期待されます。
public void setSchedulerFactoryClass(ClassSE<? extends SchedulerFactory> schedulerFactoryClass)
SchedulerFactory
実装を設定します。 デフォルトは StdSchedulerFactory
クラスで、quartz.jar
から標準の quartz.properties
を読み取ります。カスタム Quartz プロパティを適用するには、このローカル SchedulerFactoryBean
インスタンスで "configLocation"
や "quartzProperties"
などを指定します。
public void setSchedulerName(StringSE schedulerName)
org.quartz.scheduler.instanceName
プロパティの代わりに、SchedulerFactory を介して作成するスケジューラーの名前を設定します。 指定しない場合、名前は Quartz プロパティ(org.quartz.scheduler.instanceName
)または宣言された SchedulerFactoryBean
Bean 名からフォールバックとして取得されます。
public void setConfigLocation(Resource configLocation)
メモ: 必要なすべてのプロパティがこの Bean を介してローカルで指定されている場合、または Quartz のデフォルト構成に依存している場合は省略できます。
public void setQuartzProperties(PropertiesSE quartzProperties)
Quartz プロパティ構成ファイルの値をオーバーライドするため、またはローカルで必要なすべてのプロパティを指定するために使用できます。
public void setTaskExecutor(ExecutorSE taskExecutor)
Executor
SE を Quartz バックエンドとして使用するように設定します。Quartz SPI を介してスレッドプールとして公開されます。ローカルの JDK ThreadPoolExecutor または CommonJ WorkManager を Quartz バックエンドとして割り当て、Quartz の手動スレッド作成を回避するために使用できます。
デフォルトでは、Quartz SimpleThreadPool が使用され、対応する Quartz プロパティを通じて構成されます。
public void setDataSource(DataSourceSE dataSource)
DataSource
SE を設定します。 メモ: これが設定されている場合、意味のない二重構成を回避するために、Quartz 設定でジョブストア "dataSource" を定義しないでください。また、"org.quartz.jobStore.class" プロパティはまったく定義しないでください。(Spring の LocalDataSourceJobStore
を明示的に定義することもできますが、このメソッドを使用する場合はこれがデフォルトです。)
Quartz の Spring 固有のサブクラスの JobStoreCMT が使用されます。Spring で管理された(またはプレーンな JTA)トランザクション内でスケジューラのすべての操作を実行することを強くお勧めします。そうでなければ、データベースのロックは正しく機能せず、壊れる可能性さえあります(たとえば、トランザクションなしで Oracle のロックを取得しようとした場合)。
トランザクションと非トランザクションの両方の DataSource アクセスをサポートします。非 XA DataSource およびローカル Spring トランザクションでは、DataSource 引数は 1 つで十分です。XA DataSource およびグローバル JTA トランザクションの場合、SchedulerFactoryBean の "nonTransactionalDataSource" プロパティを設定して、グローバルトランザクションに参加しない非 XA DataSource を渡す必要があります。
public void setNonTransactionalDataSource(DataSourceSE nonTransactionalDataSource)
DataSource
SE を設定します。これは、デフォルトの DataSource が常にトランザクションに参加する XA DataSource である場合にのみ必要です。そのようなシナリオでは、その DataSource の非 XA バージョンを "nonTransactionalDataSource" として指定する必要があります。
これは、ローカル DataSource インスタンスおよび Spring トランザクションには関係ありません。そこでは、単一のデフォルト DataSource を "dataSource" として指定するだけで十分です。
public void setSchedulerContextAsMap(MapSE<StringSE,?> schedulerContextAsMap)
メモ: JobDetail がデータベースに保持される永続的なジョブを使用する場合は、Spring 管理の Bean または ApplicationContext 参照を JobDataMap ではなく SchedulerContext に配置しないでください。
schedulerContextAsMap
- String キーと任意のオブジェクトを値として持つ Map (たとえば、Spring に管理された Bean)JobDetailFactoryBean.setJobDataAsMap(java.util.Map<java.lang.String, ?>)
public void setApplicationContextSchedulerContextKey(StringSE applicationContextSchedulerContextKey)
ApplicationContext
参照のキーを設定します(例: "applicationContext" )。デフォルトはなしです。Spring ApplicationContext で実行する場合にのみ適用されます。メモ: JobDetail がデータベースに保持される永続ジョブを使用する場合は、ApplicationContext 参照を JobDataMap ではなく SchedulerContext に配置してください。
QuartzJobBean の場合、参照は Bean プロパティとしてジョブインスタンスに適用されます。"applicationContext" 属性は、そのシナリオの "setApplicationContext" メソッドに対応します。
Quartz 自体がジョブのライフサイクルを担当するため、ApplicationContextAware のような BeanFactory コールバックインターフェースは Quartz ジョブインスタンスに自動的に適用されないことに注意してください。
public void setJobFactory(JobFactory jobFactory)
JobFactory
を設定します。 デフォルトは Spring の AdaptableJobFactory
で、Runnable
SE オブジェクトと標準の Quartz Job
インスタンスをサポートします。このデフォルトはローカルスケジューラにのみ適用され、RemoteScheduler には適用されないことに注意してください(カスタム JobFactory の設定は Quartz ではサポートされていません)。
ここで Spring の SpringBeanJobFactory
のインスタンスを指定して(通常は内部 Bean 定義として)、指定したジョブデータマップとスケジューラコンテキストからジョブの Bean プロパティを自動的に設定します。
AdaptableJobFactory
, SpringBeanJobFactory
public void setAutoStartup(boolean autoStartup)
デフォルトは "true" です。手動で起動できるようにするには、これを "false" に設定します。
public boolean isAutoStartup()
public void setPhase(int phase)
Integer.MAX_VALUE
です。つまり、このスケジューラーはできるだけ遅く開始し、できるだけ早く停止します。public int getPhase()
Phased
の getPhase
SmartLifecycle
の getPhase
SmartLifecycle.isAutoStartup()
, Lifecycle.start()
, SmartLifecycle.stop(Runnable)
, DefaultLifecycleProcessor.getPhase(Lifecycle)
public void setStartupDelay(int startupDelay)
これを 10 または 20 秒に設定することは、アプリケーション全体が起動する前にジョブを実行する必要がない場合に意味があります。
public void setExposeSchedulerInRepository(boolean exposeSchedulerInRepository)
SchedulerRepository
で Spring 管理の Scheduler
インスタンスを公開するかどうかを設定します。Spring が管理するスケジューラは通常、Spring コンテキスト内でのアクセスのみを目的としているため、デフォルトは "false" です。スケジューラをグローバルに公開するには、このフラグを "true" に切り替えます。この動作に依存する既存の Spring アプリケーションがない限り、これはお勧めしません。このようなグローバルな露出は、以前の Spring バージョンでは偶発的なデフォルトであったことに注意してください。これは Spring 2.5.6 で修正されています。
public void setWaitForJobsToCompleteOnShutdown(boolean waitForJobsToCompleteOnShutdown)
デフォルトは "false" です。シャットダウンフェーズが長くなる代わりにジョブを完全に完了したい場合は、これを "true" に切り替えます。
public void setBeanName(StringSE name)
BeanNameAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init メソッドなどの init コールバックの前に呼び出されます。
BeanNameAware
の setBeanName
name
- ファクトリ内の Bean の名前。この名前は、ファクトリで使用される実際の Bean 名であり、最初に指定した名前とは異なる場合があります。特に内部 Bean 名の場合、実際の Bean 名は "#..." サフィックスを追加することで一意になります。必要に応じて、BeanFactoryUtils.originalBeanName(String)
メソッドを使用して、元の Bean 名(サフィックスなし)を抽出します。public void setApplicationContext(ApplicationContext applicationContext)
ApplicationContextAware
通常の Bean プロパティの設定後、ただし InitializingBean.afterPropertiesSet()
またはカスタム init メソッドなどの init コールバックの前に呼び出されます。ResourceLoaderAware.setResourceLoader(org.springframework.core.io.ResourceLoader)
、ApplicationEventPublisherAware.setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher)
および MessageSourceAware
の後に呼び出されます(該当する場合)。
ApplicationContextAware
の setApplicationContext
applicationContext
- このオブジェクトによって使用される ApplicationContext オブジェクト BeanInitializationException
public void afterPropertiesSet() throws ExceptionSE
InitializingBean
BeanFactoryAware
、ApplicationContextAware
などを満たした後、包含 BeanFactory
によって呼び出されます。このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されたときに、その全体的な構成の検証と最終的な初期化を実行できます。
InitializingBean
の afterPropertiesSet
ExceptionSE
- 構成の誤り(必須プロパティの設定の失敗など)の場合、またはその他の理由で初期化が失敗した場合 protected Scheduler createScheduler(SchedulerFactory schedulerFactory, @Nullable StringSE schedulerName) throws SchedulerException
afterPropertiesSet()
によって呼び出されます。 デフォルトの実装では、SchedulerFactory の getScheduler
メソッドを呼び出します。カスタムスケジューラを作成するためにオーバーライドできます。
schedulerFactory
- スケジューラを作成するファクトリ schedulerName
- 作成するスケジューラの名前 SchedulerException
- Quartz メソッドによってスローされた場合 afterPropertiesSet()
, SchedulerFactory.getScheduler()
protected void startScheduler(Scheduler scheduler, int startupDelay) throws SchedulerException
scheduler
- 開始するスケジューラ startupDelay
- スケジューラを非同期で開始する前に待機する秒数 SchedulerException
public Scheduler getScheduler()
SchedulerAccessor
SchedulerAccessor
の getScheduler
@Nullable public Scheduler getObject()
FactoryBean
BeanFactory
と同様に、これにより、シングルトンとプロトタイプの両方のデザインパターンをサポートできます。
この FactoryBean が呼び出し時にまだ完全に初期化されていない場合(たとえば、循環参照に関係しているため)、対応する FactoryBeanNotInitializedException
をスローします。
Spring 2.0 以降、FactoryBeans は null
オブジェクトを返すことができます。ファクトリはこれを通常の値として使用します。この場合、FactoryBeanNotInitializedException はスローされません。FactoryBean の実装では、必要に応じて FactoryBeanNotInitializedException 自体をすぐにスローすることをお勧めします。
FactoryBean<Scheduler>
の getObject
null
にすることができます)FactoryBeanNotInitializedException
public ClassSE<? extends Scheduler> getObjectType()
FactoryBean
null
を返します。これにより、たとえばオートワイヤーなどで、オブジェクトをインスタンス化せずに特定の型の Bean を確認できます。
シングルトンオブジェクトを作成している実装の場合、このメソッドはシングルトンの作成を可能な限り回避しようとします。むしろ、事前に型を推定する必要があります。プロトタイプの場合、ここで意味のある型を返すこともお勧めします。
このメソッドは、この FactoryBean が完全に初期化される前に呼び出すことができます。初期化中に作成された状態に依存しないでください。もちろん、利用可能な場合はそのような状態を引き続き使用できます。
注意 : オートワイヤーは、ここで null
を返す FactoryBeans を単に無視します。FactoryBean の現在の状態を使用して、このメソッドを適切に実装することを強くお勧めします。
FactoryBean<Scheduler>
の getObjectType
null
ListableBeanFactory.getBeansOfType(java.lang.Class<T>)
public boolean isSingleton()
FactoryBean
FactoryBean.getObject()
は常に同じオブジェクト(キャッシュ可能な参照)を返しますか? 注意 : FactoryBean がシングルトンオブジェクトを保持することを示す場合、getObject()
から返されたオブジェクトは所有 BeanFactory によってキャッシュされる可能性があります。FactoryBean が常に同じ参照を公開しない限り、true
を返さないでください。
FactoryBean 自体のシングルトンステータスは、通常、所有する BeanFactory によって提供されます。通常、そこではシングルトンとして定義する必要があります。
注意 : false
を返すこのメソッドは、返されるオブジェクトが独立したインスタンスであることを必ずしも示しません。拡張 SmartFactoryBean
インターフェースの実装は、SmartFactoryBean.isPrototype()
メソッドを通じて独立したインスタンスを明示的に示す場合があります。この拡張インターフェースを実装しないプレーンな FactoryBean
実装は、isSingleton()
実装が false
を返す場合、常に独立したインスタンスを返すと単純に想定されます。
FactoryBean
は通常シングルトンインスタンスを管理するため、デフォルトの実装は true
を返します。
FactoryBean<Scheduler>
の isSingleton
FactoryBean.getObject()
, SmartFactoryBean.isPrototype()
public void start() throws SchedulingException
Lifecycle
コンポーネントがすでに実行されている場合は、例外をスローしないでください。
コンテナーの場合、これは適用されるすべてのコンポーネントに開始信号を伝播します。
Lifecycle
の start
SchedulingException
SmartLifecycle.isAutoStartup()
public void stop() throws SchedulingException
Lifecycle
SmartLifecycle
とその stop(Runnable)
バリアントの実装を検討してください。 この停止通知は破棄前に送信されるとは限らないことに注意してください。通常のシャットダウンでは、一般的な破棄コールバックが伝播される前に、Lifecycle
Bean は最初に停止通知を受信します。ただし、コンテキストの存続期間中のホットリフレッシュまたは中断されたリフレッシュ試行では、特定の Bean の destroy メソッドが、停止信号を事前に考慮することなく呼び出されます。
コンポーネントが実行されていない(まだ開始されていない)場合は、例外をスローしないでください。
コンテナーの場合、これは停止信号を適用するすべてのコンポーネントに伝播します。
Lifecycle
の stop
SchedulingException
SmartLifecycle.stop(Runnable)
, DisposableBean.destroy()
public boolean isRunning() throws SchedulingException
Lifecycle
コンテナーの場合、これは、適用されるすべてのコンポーネントが現在実行されている場合にのみ、true
を返します。
Lifecycle
の isRunning
SchedulingException
public void destroy() throws SchedulerException
DisposableBean
の destroy
SchedulerException