JobSchedulerでのジョブの多重実行・排他制御
- 3. JobSchedulerで並列ジョブの作り
方
1. Stand Alone Job
ジョブ定義のシェルで実行プログラムを複数実行する
→エラー制御や排他制御まで書く必要がある
→JobScheduler使う意味ないじゃん?
2. Job Chain
Job ChainのOrder Jobを同時に実行する
→Order Jobは、順番にしか実行できない
→じゃあ、できないじゃん?
3. Orderを並列に発行する
- 5. Orderを並列実行する方法
Job Chain: ParallelSample
Job 1
execute
execute
execute
sync
Job 3
Job Chain:
ParallelExecution
Job 2-1
sync
Job 2-2
Job 2-3
2つのJob Chain
ParallelSample:Orderを生成/発行するだけ
ParallelExecution:ジョブを並列実行する
- 6. ジョブ並列実行の仕組み
Job Chain: ParallelSample
①Order1
Job 1
State=100
State=p1
Execute
State=p1
Job Chain:
ParallelExecution
Orderp State=p1
1:1
②Order1
State=p2
Execute
State=p2
Orderp State=p2
2:1
③Order1
State=p3
Execute
State=p3
Sync
State=sync
Job 3
State=300
Orderp State=p3
3:1
Job 2-1
State=p1
Sync
State=sync
Job 2-2
State=p2
Job 2-3
State=p3
Orderは、実行Jobの処理完了を待たずに次のNodeに遷移す
る
Orderを生成実行するJob (execute)は、一つのJobを異なる
StateとParameterで3回繰り返し実行する
- 7. ParallelSample.job_chain.xml
<job_chain orders_recoverable="yes" visible="yes">
<job_chain_node state="100" job="anyJobBefore" next_state="p1" error_state="error"/>
<job_chain_node state="p1" job="execute" next_state="p2" error_state="error"/>
<job_chain_node state="p2" job="execute" next_state="p3" error_state="error"/>
<job_chain_node state="p3" job="execute" next_state="sync" error_state="error"/>
<job_chain_node state="sync" job="Sync" next_state="200" error_state="error"/>
<job_chain_node state="200" job="anyJobAfter" next_state="success"
error_state="error"/>
<job_chain_node state="success"/>
<job_chain_node state="error"/>
</job_chain>
execute jobを異なるStateと
Parameterで3回繰返して実行す
る
- 8. execute.job.xml
<job
order="yes" stop_on_error="no" tasks="3">
<params >
<param name="job_chain" value="/SampleParallel/ParallelExecution"/>
</params>
返り値がtrueの場合Next_stateのNodeに
Orderを進めます。
<script language="java:javascript">
<![CDATA[
function spooler_process(){
処理中のOrderを返します。
var actOrder = spooler_task.order;
Orderを作成します。
var order = spooler.create_order();
var job_chain = spooler.job_chain(spooler_task.params.value("job_chain"));
order.state = actOrder.state;
Job Chain名を返します。
order.params.merge(actOrder.params);
order.id = order.state + ":" + actOrder.id;
job_chain.add_or_replace_order(order);
return true;
Job ChainにOrderを追加し、もし
}
同じOrder IDがあれば上書きしま
]]>
す。
</script>
<monitor name="configuration_monitor">
<script java_class="sos.scheduler.managed.configuration.ConfigurationOrderMonitor"
language="java" java_class_path=""/>
</monitor>
<run_time />
</job>
Job Chain内のJobにParameterを
受渡する内部APIを定義
- 10. ParallelExecution.job_chain.xml
p1->sync, p2->sync, p3->syncという3
通りの実行フローを作成します
<job_chain orders_recoverable="yes" visible="yes">
<job_chain_node state="p1" job="ParallelJob1" next_state="sync" error_state="error"/>
<job_chain_node
state="p2" job="ParallelJob2" next_state="sync" error_state="error"/>
<job_chain_node
state="p3" job="ParallelJob3" next_state="sync" error_state="error"/>
<job_chain_node
state="sync" job="Sync" next_state="success" error_state="error"/>
<job_chain_node
state="success"/>
<job_chain_node
</job_chain>
state="error"/>
待ち合わせジョブ
- 11. Sync.job.xml
同期対象とするOrderを指定するために、同期したい Order 数を Parameterと
して定義します。
<job order="yes" tasks="1"> ParallelExecutionで3回、ParallelSampleで1回のOrderを実行するので、
ParallelExecution_required_ordersを3、ParallelSample_required_ordersを1
とします。
<params >
<param name="ParallelExecution_required_orders" value="3"/>
<param name="ParallelSample_required_orders" value="1"/>
</params>
<script language="java" java_class="sos.scheduler.job.JobSchedulerSynchronizeJobChains"
java_class_path=""/>
<run_time />
</job>
待ち合わせを行う内部APIを定義