LoginSignup
0
1

More than 5 years have passed since last update.

JobScheduler JobChain内でのエラー発生時の再実行処理

Posted at

ジョブフロー(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定義となります。

test_jobchain.job_chain.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で指定したノードに移動する場合です。

job1.job.xml
<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日おきに繰り返し実行

job1.job.xml
<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と設定し停止状態に遷移させる運用が良いです。

job1.job.xml
<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>
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1