【発生条件】
複数のAPサーバでジョブスケジューラサービスが起動していること
【原因】
複数サーバでのトリガーステータス更新のタイミングにおけるごく稀な事象です。
トリガーのステータス変異はWAITING -> ACQUIRED -> EXECUTING -> WAITING と遷移します。
AP1で発火予定のステータス「WAITING」のトリガー取得を実施。
AP1でトリガーの更新(WAITING -> ACQUIREDに更新)トランザクションが終わる前にAP2でステータスが「WAITING」のトリガー取得が実行される。
その後AP1のトランザクションが完了する。
AP2でステータス「ACQUIRED」に更新する前にAP1でトリガー発火完了の「ACQUIRED -> EXECUTING -> WAITING」へステータス更新が実行される。
このとき、AP1ではトリガー発火がおわっているがAP2では発火していないトリガーと判断されてAP2でも発火します。
【回避方法】
以下のいずれかの方法で回避できます。
次に発火するトリガーを取得する際に、ロックを獲得するよう設定することで回避できます。
intra-mart Accel Platform 2016 Summer以降の場合は以下で設定できます。
im-job-scheduler-config.xmlのロック獲得設定をtrueに変更することで回避できます。
https://www.intra-mart.jp/document/library/iap/public/configuration/im_configuration_reference/texts/im_job_scheduler/im-job-scheduler-config/index.html#im-job-scheduler_acquire-triggers-within-lock
intra-mart Accel Platform 2016 Spring以前の場合は以下で設定できます。
WEB-INF/classes配下にim_job_scheduler.properties
というファイルを作成し、以下を指定することで回避できます。
org.quartz.jobStore.acquireTriggersWithinLock=true
ジョブスケジューラサービスを単一サーバにすることで回避できます。
-- 対象 ------------------------------------------------------------------------
iAP/Accel Platform/全アップデート
--------------------------------------------------------------------------------
FAQID:598
複数のAPサーバでジョブスケジューラの同一のトリガーが2重発火します。原因と対処を教えて下さい。
