Quartzで重複タスク起動を防ぐには
クォーツによる重複的なジョブの起動を防ぐために取れる措置
- 非永続タスクを使用する: タスクを作成する際、タスクを永続性に設定しない(non-durableにする)。非永続タスクはアクティブなトリガーがない時には再実行されません。
- 排他的タスクの設定:タスクの排他属性(exclusive)を使用することで、タスクを1つのインスタンスでのみ実行できます。Quartzはタスクを起動するときに、同じタスクを実行中の別のインスタンスがあるかどうかを確認します。ある場合は、現在のインスタンスはタスクを起動しません。これは、JobDetailのexclusiveプロパティをtrueに設定することで実現できます。
- 実行中のタスクを判定するためには、データベースのレコードやメモリー上のフラグといった仕組みで、すでにタスクが実行中かどうか判定する仕組みを設ける。タスクがすでに実行中の場合は、新しいタスクは起動しないようにする。
- クラスタリングを利用する:Quartzではクラスタリングを使用すると、同一ジョブはクラスタ内の1ノードでのみ実行されるように自動的に制御されます。これにより、重複してジョブが起動するのを防ぐことができます。
- 设置触发器的错过策略:在创建触发器时,可以设置触发器的错过策略(misfire policy)。错过策略可以处理由于任务执行时间过长或触发器错过时间导致的任务重复执行的情况。
上記の手法を行うことにより、Quartz がタスクの重複開始を効果的に回避できます。