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
コンストラクターと説明 |
---|
SchedulerFactoryBean() |
修飾子と型 | メソッドと説明 |
---|---|
void | afterPropertiesSet() 指定されたすべての Bean プロパティを設定した(そして BeanFactoryAware と ApplicationContextAware を満たした)後に BeanFactory によって呼び出されます。 |
protected Scheduler | createScheduler(SchedulerFactory schedulerFactory, StringSE schedulerName) 指定されたファクトリとスケジューラー名のスケジューラーインスタンスを作成します。 |
void | destroy() Bean ファクトリシャットダウン時に Quartz スケジューラをシャットダウンし、スケジュールされたすべてのジョブを停止します。 |
static DataSourceSE | getConfigTimeDataSource() LocalDataSourceJobStore で使用される、現在構成されている Quartz スケジューラの DataSource を返します。 |
static DataSourceSE | getConfigTimeNonTransactionalDataSource() LocalDataSourceJobStore で使用される、現在構成されている Quartz スケジューラの非トランザクション DataSource を返します。 |
static ResourceLoader | getConfigTimeResourceLoader() ResourceLoaderClassLoadHelper で使用される、現在構成されている Quartz スケジューラの ResourceLoader を返します。 |
static ExecutorSE | getConfigTimeTaskExecutor() LocalTaskExecutorThreadPool で使用される、現在構成されている Quartz スケジューラの TaskExecutor を返します。 |
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 を設定します。 |
void | setExposeSchedulerInRepository(boolean exposeSchedulerInRepository) Quartz SchedulerRepository で Spring 管理の Scheduler インスタンスを公開するかどうかを設定します。 |
void | setJobFactory(JobFactory jobFactory) このスケジューラで使用する Quartz JobFactory を設定します。 |
void | setNonTransactionalDataSource(DataSourceSE nonTransactionalDataSource) DataSource を設定して、スケジューラが非トランザクションアクセスに使用できるようにします。 |
void | setPhase(int phase) このスケジューラーを開始および停止するフェーズを指定します。 |
void | setQuartzProperties(PropertiesSE quartzProperties) "org.quartz.threadPool.class" などの Quartz プロパティを設定します。 |
void | setSchedulerContextAsMap(MapSE<StringSE,?> schedulerContextAsMap) 指定されたマップを介してスケジューラコンテキストにオブジェクトを登録します。 |
void | setSchedulerFactoryClass(ClassSE<? extends SchedulerFactory> schedulerFactoryClass) 使用する Quartz SchedulerFactory 実装を設定します。 |
void | setSchedulerName(StringSE schedulerName) SchedulerFactory を介して作成するスケジューラーの名前を設定します。 |
void | setStartupDelay(int startupDelay) 初期化後、スケジューラーを非同期で開始する前に待機する秒数を設定します。 |
void | setTaskExecutor(ExecutorSE taskExecutor) Quartz バックエンドとして使用する Spring TaskExecutor を設定します。 |
void | setWaitForJobsToCompleteOnShutdown(boolean waitForJobsToCompleteOnShutdown) シャットダウン時に実行中のジョブが完了するのを待つかどうかを設定します。 |
void | start() このコンポーネントを起動します。 |
protected void | startScheduler(Scheduler scheduler, int startupDelay) "startupDelay" 設定を考慮して、Quartz スケジューラを起動します。 |
void | stop() このメソッドを返すとコンポーネントが完全に停止するように、通常は同期的にこのコンポーネントを停止します。 |
void | stop(RunnableSE callback) Lifecycle コンポーネントが現在実行中の場合、停止する必要があることを示します。 |
registerJobsAndTriggers, registerListeners, setCalendars, setGlobalJobListeners, setGlobalTriggerListeners, setJobDetails, setJobSchedulingDataLocation, setJobSchedulingDataLocations, setOverwriteExistingJobs, setResourceLoader, setSchedulerListeners, setTransactionManager, setTriggers
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public static final int DEFAULT_THREAD_COUNT
public static ResourceLoader getConfigTimeResourceLoader()
このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
public static ExecutorSE getConfigTimeTaskExecutor()
このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
public static DataSourceSE getConfigTimeDataSource()
このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
public static DataSourceSE getConfigTimeNonTransactionalDataSource()
このインスタンスは、対応するスケジューラの初期化の前に設定され、直後にリセットされます。構成時にのみ使用できます。
public void setSchedulerFactoryClass(ClassSE<? extends SchedulerFactory> schedulerFactoryClass)
デフォルトは StdSchedulerFactory
で、quartz.jar
から標準の quartz.properties
を読み取ります。カスタム Quartz プロパティを使用するには、この FactoryBean で "configLocation" または "quartzProperties" Bean プロパティを指定します。
public void setSchedulerName(StringSE schedulerName)
指定しない場合、Bean 名がデフォルトのスケジューラー名として使用されます。
public void setConfigLocation(Resource configLocation)
メモ: 必要なすべてのプロパティがこの Bean を介してローカルで指定されている場合、または Quartz のデフォルト構成に依存している場合は省略できます。
public void setQuartzProperties(PropertiesSE quartzProperties)
Quartz プロパティ構成ファイルの値をオーバーライドするため、またはローカルで必要なすべてのプロパティを指定するために使用できます。
public void setTaskExecutor(ExecutorSE taskExecutor)
JDK 1.5 ThreadPoolExecutor または CommonJ WorkManager を Quartz バックエンドとして割り当て、Quartz の手動スレッド作成を回避するために使用できます。
デフォルトでは、Quartz SimpleThreadPool が使用され、対応する Quartz プロパティを通じて構成されます。
public void setDataSource(DataSourceSE dataSource)
メモ: これが設定されている場合、意味のない二重構成を回避するために、Quartz 設定ではジョブストア "dataSource" を定義しないでください。
Quartz の Spring 固有のサブクラスの JobStoreCMT が使用されます。Spring で管理された(またはプレーンな JTA)トランザクション内でスケジューラのすべての操作を実行することを強くお勧めします。そうでなければ、データベースのロックは正しく機能せず、壊れる可能性さえあります(たとえば、トランザクションなしで Oracle のロックを取得しようとした場合)。
トランザクションおよび非トランザクションの両方の DataSource アクセスをサポートします。非 XA DataSource およびローカル Spring トランザクションの場合、単一の DataSource 引数で十分です。XA DataSource およびグローバル JTA トランザクションの場合、SchedulerFactoryBean の "nonTransactionalDataSource" プロパティを設定し、グローバルトランザクションに参加しない非 XA DataSource を渡す必要があります。
public void setNonTransactionalDataSource(DataSourceSE nonTransactionalDataSource)
これは、デフォルトの DataSource が常にトランザクションに参加する XA DataSource である場合にのみ必要です。このようなシナリオでは、その DataSource の非 XA バージョンを "nonTransactionalDataSource" として指定する必要があります。
これは、ローカル DataSource インスタンスおよび Spring トランザクションには関係ありません。単一のデフォルト DataSource を "dataSource" として指定するだけで十分です。
public void setSchedulerContextAsMap(MapSE<StringSE,?> schedulerContextAsMap)
メモ: JobDetail がデータベースに保持される永続的なジョブを使用する場合は、Spring 管理の Bean または ApplicationContext 参照を JobDataMap ではなく SchedulerContext に配置しないでください。
schedulerContextAsMap
- 文字列キーとオブジェクトを値としてマップ (たとえば、Spring に管理された Bean)JobDetailFactoryBean.setJobDataAsMap(java.util.Map<java.lang.String, ?>)
public void setApplicationContextSchedulerContextKey(StringSE applicationContextSchedulerContextKey)
メモ: JobDetail がデータベースに保持される永続ジョブを使用する場合は、ApplicationContext 参照を JobDataMap ではなく SchedulerContext に配置してください。
QuartzJobBean の場合、参照は Bean プロパティとしてジョブインスタンスに適用されます。そのシナリオでは、"applicationContext" 属性 は "setApplicationContext" メソッドに対応します。
Quartz 自体がジョブのライフサイクルを担当するため、ApplicationContextAware のような BeanFactory コールバックインターフェースは Quartz ジョブインスタンスに自動的に適用されないことに注意してください。
public void setJobFactory(JobFactory jobFactory)
デフォルトは Spring の AdaptableJobFactory
で、Runnable
SE オブジェクトと標準の Quartz Job
インスタンスをサポートします。このデフォルトはローカルスケジューラにのみ適用され、RemoteScheduler には適用されないことに注意してください(カスタム JobFactory の設定は Quartz ではサポートされていません)。
ここで Spring の SpringBeanJobFactory
のインスタンスを指定して(通常は内部 Bean 定義として)、指定したジョブデータマップとスケジューラコンテキストからジョブの Bean プロパティを自動的に設定します。
public void setAutoStartup(boolean autoStartup)
デフォルトは "true" です。手動で起動できるようにするには、これを "false" に設定します。
public boolean isAutoStartup()
public void setPhase(int phase)
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
このメソッドにより、Bean インスタンスは、すべての Bean プロパティが設定されている場合にのみ可能な初期化を実行し、設定ミスの場合に例外をスローできます。
InitializingBean
の afterPropertiesSet
ExceptionSE
- 設定ミス(必須プロパティの設定の失敗など)が発生した場合、または初期化が失敗した場合。protected Scheduler createScheduler(SchedulerFactory schedulerFactory, 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
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<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 は一般的な破棄コールバックが伝達される前に、まず停止通知を受け取ります。ただし、コンテキストの有効期間中のホットリフレッシュ時、またはリフレッシュ試行が中止されたときは、destroy メソッドのみが呼び出されます。
コンポーネントがまだ開始されていない場合は、例外をスローしないでください。
コンテナーの場合、これは停止シグナルを適用するすべてのコンポーネントに伝播します。
Lifecycle
の stop
SchedulingException
SmartLifecycle.stop(Runnable)
, DisposableBean.destroy()
public void stop(RunnableSE callback) throws SchedulingException
SmartLifecycle
提供されたコールバックは、LifecycleProcessor
によって使用され、共通のシャットダウン順序値を持つすべてのコンポーネントの順序付けられた、潜在的に同時のシャットダウンをサポートします。コールバック は、SmartLifecycle
コンポーネントが実際に停止した後に実行する必要があります。
LifecycleProcessor
は、stop
メソッドのこのバリアントのみを呼び出します。つまり、SmartLifecycle
実装では、このメソッドの実装内に明示的に委譲されない限り、Lifecycle.stop()
は呼び出されません。
SmartLifecycle
の stop
SchedulingException
Lifecycle.stop()
, Phased.getPhase()
public boolean isRunning() throws SchedulingException
Lifecycle
コンテナーの場合、これは、適用されるすべてのコンポーネントが現在実行されている場合にのみ、true
を返します。
Lifecycle
の isRunning
SchedulingException
public void destroy() throws SchedulerException
DisposableBean
の destroy
SchedulerException