ジョブとジョブチェーン、さらにオーダー
JobSchedulerのジョブには、スタンドアロンジョブ(Standalone Job)とオーダージョブ(Ordered Job)の2種類があります。スタンドアロンジョブは後で説明するジョブチェーン(Job Chain)に組み込むことが出来ません。オーダージョブはジョブチェーンに組み込むことができます。
つまり、この2つは両極端なのです。ただ、JOEで(もちろんXMLファイルを直接編集しても)簡単にスタンドアロンジョブとオーダージョブを切り替えることが出来ます。
ジョブチェーンは、複数のオーダージョブを束ねたもので、基本的には組み込まれたオーダージョブを順に実行します。ジョブチェーンが全体の処理(ジョブ)の流れを制御して、オーダージョブが個別の処理(ジョブ)を実行するといったイメージが持てれば良いでしょう。
また、ジョブチェーンは、ジョブ(オーダージョブ)の実行結果が成功か否かによって、次に実行するジョブ(オーダージョブ)を切り替えるといった設定を行うことが出来ます。(成功・失敗だけでなく、複数の結果を制御する機能もあります)
オーダーはジョブチェーンの実際の実行設定です。例えばあるジョブチェーンを違うパラメータで2つ起動したい場合は、2つのオーダーを作って、それぞれにパラメータを指定します。オーダーには実行スケジュールも個別に指定することができます。
(オーダー:Orderとオーダージョブ:Ordered Jobは別の概念です。オーダージョブはジョブチェーンに組み込まれる1つ1つのジョブで、オーダーはジョブチェーンにパラメータと実行スケジュールを与えて、実行を制御するものです。混同しないようにしましょう。)
ジョブチェーン内でのオーダーの動き
上図を見てください。3つのオーダージョブから構成されるジョブチェーンです。オーダーが2つあるので、このジョブチェーンは(おそらく異なるパラメータで)2つが並行で実行されます。
ステートという言葉が出てきました。ジョブチェーンは1つのオーダージョブが1つのステートに紐付きます。(より正確に言えば、ジョブチェーンは複数のステートで構成され、ステートごとに実行するオーダージョブが紐付くのです。そして、ジョブチェーンの最後に終了ステートがあります。)
オーダーは、まるでトークンのようにステートを遷移していきます。オーダーがstate-1に入ると、Ordered Job #1が実行されます。Ordered Job #1が正常終了すると、オーダーはstate-2に遷移します。state-2ではOrdered Job #2が実行されます。もしOrdered Job #2が異常終了した場合、オーダーはerrorというステートに遷移します。errorは終了ステートに設定されているのでオーダージョブは紐付いていません。オーダーがくり返し実行されるように設定されている場合は、最初のステートに移り、次の実行タイミングを待ちます。
また、あるステートで実行したオーダージョブが異常終了した場合、すぐにerrorステートなどのステートに遷移させずに、リトライ(JobSchedulerではセットバックと呼びます)したり、サスペンドさせておいたりすることが出来ます。
セットバックでは実行回数や待ち時間を設定できます。何回かの実行の後、オーダージョブが正常終了すると、そのステートは正常終了したものとして正常時の次のステートに遷移します。実行回数の上限までオーダージョブが異常終了すると、その時点でそのステートもerrorステートなどのステートに遷移します。
サスペンドは、例えばユーザがJOCでレジュームの操作をするまでジョブチェーンの実行を停止します。オーダージョブを正常終了させるために、何らかのユーザ操作が必要となる場合などは、サスペンドを使うと良いでしょう。
オーダーの起動タイミング
オーダーの起動タイミングは繰り返しでの自動実行が指定されている場合は、オーダーに指定した実行スケジュールに因ります。
JobSchedulerでは、このような時間トリガーだけではなく、ファイルの着信をトリガーとする機能(ディレクトリモニタリング)を持っています。業務システムではファイルのやりとりでデータ連携をするようなケースも多いので、そうした際に活用できるのではないかと思います。
ジョブに関するその他の機能
ジョブはJobSchedulerの根幹となる機能であるだけに、豊富な機能が準備されています。例えば、ロック(排他ロック、共有ロック)、ジョブチェーンのネストなどです。
一度、JobSchedulerの公式サイトを参照いただくと良いと思います。