Create: 2013/03/22
LastUpdate: 2013/05/22
下図の環境を使用します。
環境の詳細を知りたい場合は、メニューに戻って構築手順を参照してください。
JobChain では、シーケンシャルなジョブの連携しか定義できませんでしたが、
イベントを利用することで、複雑な条件のジョブ連携が可能になります。
ここでは、JobChainの同期を試して見ます。
手順については、「JobScheduler Events(PDF)」を参考にしました。
下図のように3つのJobChain が Syncジョブで同期して、Syncジョブ以降は同時に処理するようにします。
(図:JobSchedulerEventsマニュアルから引用)
テスト(動作確認)の流れは以下のとおり。
①JobChain01、JobChain02 を順番に実行します。
②JobChain01とJobChain02が、Syncジョブの位置で Suspend 状態になります。
③JobChain03 を実行します。
④JobChain03がSyncジョブまで処理が終わると、JobChain01、JobChan02のSuspendが自動的に解除されて3つのJobChainが同時に実行されます。 (同期)
②JobChain01とJobChain02が、Syncジョブの位置で Suspend 状態になります。
③JobChain03 を実行します。
④JobChain03がSyncジョブまで処理が終わると、JobChain01、JobChan02のSuspendが自動的に解除されて3つのJobChainが同時に実行されます。 (同期)
1.テスト用の OrderJob 定義
JOEで下図のようにジョブを定義します。
テスト用に正常終了すればいいだけなのでシェルで簡単なスクリプトを記述します。
なお、このジョブは、Host-Aで実行します。
2.同期用の OrderJob 定義
JOEで下図のようにジョブを定義します。
JobChainの同期には、JobScheduler で用意されたJavaアプリケーションを使用します。
[Classname]に、”sos.scheduler.job.JobSchedulerSynchronizeJobChains” を入力します。
3.JobChain 定義
JOEでJobChainを3つ定義します。
まず、JobChain01 を作ります。
JobChain02 を作ります。
JobChain03 を作ります。
4.動作確認
JOCで JobChain01とJobChain02 を 実行 します。
下図のように Suspend 状態になるまで待ちます。
JobChain03 を 実行 します。
JobChain01、JobChain02の Suspend が自動的に解除されて、3つのJobChainが正常終了します。
実行結果は下図のとおり。
■ 補足
同期に使用した sos.scheduler.job.JobSchedulerSynchronizeJobChains(以降、SyncJobChainsと記載) は、ジョブ定義で以下のようにドキュメントを指定すると、JOC で詳細な説明を見ることができます。(赤字部分)
<job order="yes" stop_on_error="no" title="Synchronized JobChain"> <description> <include file="jobs/JobSchedulerSynchronizeJobChains.xml"/> </description> <script language="java" java_class_path="" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"/> <run_time/> </job>SyncJobChains は、パラメータを設定することで、同期する方法をいろいろと指定できます。
私が試したパラメータをいくつか紹介します。
(1) パラメータなしの場合
上記でも、紹介しましたが、同じホットフォルダ内で SyncJobChains を定義した JobChain の Order が、全部、同期対象になります。
同じ JobChain から複数の Order を実行しても、同期対象になる Order は1つです。
たとえば、下図のように、job_chain01 を2回実行して2つの Order を生成した場合、この状態で job_chain03 を実行すると、OrderIDの797 は、suspended のまま残り、他は正常終了します。OrderIDの797 を正常終了させるには、job_chain02 と job_chain03 を、もう一度実行します。
(2) required_orders を指定した場合
同期したい Order 数を指定します。デフォルト値は "1" です。
SyncJobChains を定義した JobChain が全部対象になります。
たとえば、required_orders を "2" にすると、job_chain01、job_chain02、job_chain03 は、各々2回づつ実行すると正常終了します。
<job order="yes" stop_on_error="no" title="Synchronized JobChain">
<description >
<include file="jobs/JobSchedulerSynchronizeJobChains.xml"/>
</description>
<params >
<param name="required_orders" value="2"/>
</params>
<script language="java" java_class_path="" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"/>
<run_time />
</job>
下図は、5つの Order が同期待ちでサスペンドしている状態です。この状態で、job_chain03 を実行すると、すべてのサスペンドが解除されて正常終了します。
(3) [job_chain]_required_orders を指定した場合
特定の JobChain を指定して同期したい Order 数を指定します。デフォルト値は "1" です。
[job_chain]の部分は、特定の JobChain 名に置き換えて指定します。
たとえば、job_chain01_required_orders を "2" にすると、job_chain01は2回、job_chain02、job_chain03 は、各々1回づつ実行すると正常終了します。
<job order="yes" stop_on_error="no" title="Synchronized JobChain">
<description >
<include file="jobs/JobSchedulerSynchronizeJobChains.xml"/>
</description>
<params >
<param name="job_chain01_required_orders" value="2"/>
</params>
<script language="java" java_class_path="" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"/>
<run_time />
</job>
下図は、3つの Order が同期待ちでサスペンドしている状態です。この状態で、job_chain03 を実行すると、サスペンドが解除されて正常終了します。
また、job_chain01_required_orders を "1"、job_chain02_required_orders を "1" にして、required_orders を "0" にすると、job_chain01とjob_chain02 だけで同期します。
<job order="yes" stop_on_error="no" title="Synchronized JobChain"> <description > <include file="jobs/JobSchedulerSynchronizeJobChains.xml"/> </description> <params > <param name="job_chain01_required_orders" value="1"/> <param name="job_chain02_required_orders" value="1"/> <param name="required_orders" value="0"/> </params> <script language="java" java_class_path="" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"/> <run_time /> </job>下図は、job_chain01の Order が同期待ちでサスペンドしている状態です。
この状態で、job_chain02 を実行すると、サスペンドが解除されて正常終了します。
(4) [job_chain];[state]_required_orders を指定した場合
特定の JobChain が複数の SyncJobChains を持つ場合、state を指定して同期したい Order 数を指定します。
デフォルト値は "1" です。
[job_chain]の部分は、特定の JobChain 名に置き換え、[state]の部分は 特定の state を指定します。
たとえば、以下のような2つの流れ(Job1→sync1、Job2→sync2)をもつ job_chain04 を追加で定義した場合
<?xml version="1.0" encoding="ISO-8859-1"?> <job_chain orders_recoverable="yes" visible="yes" title="Sync Test04 (2 sync)"> <job_chain_node state="Job1" job="job0" next_state="sync1" error_state="error"/> <job_chain_node state="sync1" job="sync_job" next_state="success" error_state="error" on_error="setback"/> <job_chain_node state="Job2" job="job0" next_state="sync2" error_state="error"/> <job_chain_node state="sync2" job="sync_job" next_state="success" error_state="error" on_error="setback"/> <job_chain_node state="success"/> <job_chain_node state="error"/> </job_chain>
SyncJobChainsをパラメータなしで使用すれば、下図のように job_chain01、job_chain02、job_chain03、job_chain04(Job1開始) の Order が同期待ちでサスペンド状態になります。
この状態で、job_chain04(Job2開始)を実行すると、サスペンドが解除されて正常終了します。
この状態で、job_chain04(Job2開始)を実行すると、サスペンドが解除されて正常終了します。
次に、job_chain04(Job2)開始のOrderが2つ必要と設定してみます。
以下のように state に sync2 を指定します。
<job order="yes" stop_on_error="no" title="Synchronized JobChain">
<description >
<include file="jobs/JobSchedulerSynchronizeJobChains.xml"/>
</description>
<params >
<param name="job_chain04;sync2_required_orders" value="2"/>
</params>
<script language="java" java_class_path="" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"/>
<run_time />
</job>
下図のように、 job_chain01、job_chain02、job_chain03、job_chain04(Job1開始)、job_chain04(Job2開始)のOrderが同期まちでサスペンド状態になります。この状態で、job_chain04(Job2開始) をもう1回実行すると、サスペンドが解除されて、正常終了します。