複数のAPサーバでジョブスケジューラの同一のトリガーが2重発火します。原因と対処を教えて下さい。

 
【発生条件】  
複数の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
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
Powered by Zendesk