ジョブフロー(JobChain)の各ジョブの中で異常が発生した時に少し時間を置いて再実行したいケースがあると思います。
JobSchedulerではその辺りも非常に柔軟に対応することが可能です。
必要な設定は以下の2箇所。
- JobChainのノード設定のon_error
- Order Jobのdelay_after_error
この2つが設定されて始めて再実行処理が行われます。
JobChainのノード設定のon_error
JobChainの各ステップを示すノード設定のところにそのノードに該当するジョブの実行が失敗した時の挙動を指定することができます。
それがon_errorの設定です。
on_errorにはsuspend(処理を保留にする)とsetback(繰り返し処理する)の2種類の設定が可能です。
例えば、以下のようなフローのJobChainを参考に解説します。
Node1(job1実行)→Node2(job2実行)→SuccessNode(終端ノード)
ここでNode1のjob1に異常が発生した時にsetback(再実行)するには以下のようなXML定義となります。
<job_chain name="test_jobchain">
<job_chain_node state="Node1" job="job1" next_state="Node2" error_state="error" on_error="setback"/>
<job_chain_node state="Node2" job="job2" next_state="SuccessNode" error_state="error" on_error="setback"/>
<job_chain_node state="SuccessNode"/>
<job_chain_node state="error"/>
</job_chain>
JobChainのノードの部分のon_error=のところにsetbackを指定しています。
Order Jobのdelay_after_error
上記のようにJobChainでsetbackを行う設定を入れた上で各Jobの定義内に繰り返し処理するときの挙動を指定します。
繰り返しの挙動は様々設定可能です。
以下、2つほど参考例を紹介します。
例1: job1の異常時にでも3回まで繰り返し処理(10秒間隔で)
例えば、異常が発生した場合、最初の実行も含めて3回まで処理を繰り返し実行し、エラーならerror_stateで指定したノードに移動する場合です。
<job name="job1">
<script language="shell">
<![CDATA[
ジョブの中身
]]>
</script>
<delay_after_error error_count="1" delay="10"/>
<delay_after_error error_count="3" delay="stop"/>
<run_time />
</job>
delay_after_errorで異常発生時の繰り返しの挙動を指定可能です。
error_countで何回目のエラー発生時以降の挙動を定義するかを指定し、
delayでその時の挙動を定義します。
ここでは、まず、error_count=1なので1回目のエラーが発生した以降、delay=10なので10秒後に再実行をかける定義が書かれています。
その次の行で、error_count=3なので3回目のエラーが発生した後は、delay=stopなのでこのジョブを停止するといった指定になります。
delayは以下の3パターンで指定可能です。
- 秒数で指定
- 時刻(HH:MM:SS)で指定
- stopを指定
これを使えば、例えば次のようにまずはすぐに何度か繰り返すが、それでもうまくいかなければ翌日実行するといったことも可能です。
例2: 最初3回は10秒間隔で繰り返し、その後は1日おきに繰り返し実行
<job name="job1">
<script language="shell">
<![CDATA[
ジョブの中身
]]>
</script>
<delay_after_error error_count="1" delay="10"/>
<delay_after_error error_count="3" delay="24:00:00"/>
<delay_after_error error_count="5" delay="stop"/>
<run_time />
</job>
これで
1: エラー発生
↓10秒後
2: 再実行
↓10秒後
3: 再実行
↓24時間後
4: 再実行
↓24時間後
5: 再実行←ここで停止
こんな流れが実行できます。
※注意: デフォルトの場合、ジョブの状態は『停止』になってしまう
この時注意が必要な点としては、上記の設定の場合、setbackの処理が終わった後、ジョブは停止状態となることです。
Jobの定義の中でstop_on_errorという設定項目があります。
ここの設定をnoに設定しておかないと、JobChainの定義でerrorノードへの遷移を定義しているにもかかわらず、ノード自体が停止状態となり先に進まなくなるので注意が必要です。
例1の場合、以下のように設定することで3回エラーした後はerrorの終端ノードにJobChainが遷移し終了します。
あとから手作業で再実行させたり、手作業でジョブをスキップさせたい場合にはstop_on_error=yesと設定し停止状態に遷移させる運用が良いです。
<job name="job1" stop_on_error="no">
<script language="shell">
<![CDATA[
ジョブの中身
]]>
</script>
<delay_after_error error_count="1" delay="10"/>
<delay_after_error error_count="3" delay="stop"/>
<run_time />
</job>