STARTING |
STARTED |
STOPPING |
STOPPED |
FAILED |
COMPLETED |
ABANDONED |
<step id="stepC" next="stepD">
<properties> ... </properties>
<listeners>
<!--
Implements these interface :
StepListener,
ItemReadListener,ItemProcessListener,ItemWriteListener,
ChunkListener,
RetryReadListener,RetryProcessListener,RetryWriteListener,
SkipReadListener,SkipProcessListener,SkipWriteListener
-->
<listener ref="MyItemReadListenerImpl"/>
...
</listeners>
<chunk checkpoint-policy="item" item-count="5" time-limit="180"
buffer-items="true" skip-limit="10" retry-limit="3">
<!--
checkpoint-policy
"item" : (default) "item-count" 回ごとに JEEのトランザクションをコミット
"custom" : コミットのタイミングは "checkpoint-algorithm" で指定
item-count
time-limit 秒数
buffer-items
"true" : (default) "item-count" 回分のreader, processor の処理結果を保持
しておく。writer は、"item-count" 回に一度呼ばれる。
skip-limit
default ∞ : skippable-exception が何回発生したらエラーにするか
retry-limit
default ∞ : retryable-exception が何回発生したらエラーにするか
-->
<reader ref="pkg.MyItemReaderImpl"></reader>
<processor ref="pkg.MyItemProcessorImpl"></processor>
<writer ref="pkg.MyItemWriterImpl"></writer>
<!-- Implements CheckpointAlgorightm interface -->
<checkpoint-algorithm>pkg.MyCheckpointAlgorithm</checkpoint-algorithm>
<skippable-exception-classes>
<include class="pkg.MyItemException"/>
<exclude class="pkg.MyItemSeriousSubException"/>
</skippable-exception-classes>
<retryable-exception-classes>
<include class="pkg.MyResourceTempUnavailable"/>
</retryable-exception-classes>
<no-rollback-exception-classes>
<include class="pkg.MyResourceTempUnavailable"/>
</no-rollback-exception-classes>
</chunk>
<!-- データを分割すれば、chunk を並列に動かせる場合に
定義する -->
<partition>
<!-- JSL(Job Specification Language) 記述時にデータを分割
できるときは plan を記述。mapper と排他利用 -->
<plan partitions="2" threads="2">
<properties partition="0">
<property name="firstItem" value="0"/>
<property name="lastItem" value="500"/>
</properties>
<properties partition="1">
<property name="firstItem" value="501"/>
<property name="lastItem" value="999"/>
</properties>
</plan>
<!-- 実行時にデータを分割するときには、mapperで行う
implements PartitionMapper -->
<mapper ref="MyPartitionMapperImpl"/>
<!-- 並行して実行した結果を結合する
implements PartitionReducer -->
<reducer ref="MyPartitionReducerImpl"/>
<!-- plan 一つ分の処理結果(chunk実行結果)を収集して analyzer に渡す
implements PartitionCollector -->
<collector ref="MyPartitionCollectorImpl"/>
<!-- plan 一つ分の処理結果(chunk実行結果)の後処理を行う
implements PartitionCollector -->
<analyzer ref="MyPartitionAnalyzerImpl"/>
</partition>
<!-- on="xxx" は、Writer で @Inject した StepContext に設定
StepContext#setExitStatus(str) -->
<!-- バッチステータスを COMPLETED にする
on : Chunkの指定した終了ステータスのパターン。*(0 or more any chars),?(1 some char)
exit-status : 任意の文字列。省略時には、Chunkの指定した終了ステータス
-->
<end on="COMPLETED" exit-status="MY_COMPLETED_EXIT_STATUS"/>
<!-- バッチステータスを STOPPED にする
on : Chunkの指定した終了ステータスのパターン。*(0 or more any chars),?(1 some char)
exit-status : 任意の文字列。省略時には、Chunkの指定した終了ステータス
restart : the id of step, flow, split, decision
-->
<stop on="MY_TEMP_ISSUE_EXIST_STATUS" restart="step0"/>
<!-- バッチステータスを FAILED にする
on : Chunkの指定した終了ステータスのパターン。*(0 or more any chars),?(1 some char)
exit-status : 任意の文字列。省略時には、Chunkの指定した終了ステータス
-->
<fail on="MY_ERROR_EXIT_STATUS" exit-status="MY_ERROR_EXIT_STATUS"/>
<!-- 完了ステータスをもとに、次の Step,Flow,Split,Decision Element を実行する
on : Chunkの指定した終了ステータスのパターン。*(0 or more any chars),?(1 some char)
to : the id of step, flow, split, decision
-->
<next on="I'VE BEEN WORKING ON THE RAILROAD" to="step1"/>
</step>
<step id="stepD" next="stepE">
<batchlet ref="pkg.MyBatchletImpl">
<properties>
<property name="pname" value="pvalue"/>
</properties>
</batchlet>
<!-- on="xxx" は、Batchlet#Process の返値 -->
<end on="COMPLETED" exit-status="MY_COMPLETED_EXIT_STATUS"/>
<stop on="MY_TEMP_ISSUE_EXIST_STATUS" restart="step0"/>
<fail on="MY_ERROR_EXIT_STATUS" exit-status="MY_ERROR_EXIT_STATUS"/>
<next on="I'VE BEEN WORKING ON THE RAILROAD"/>
</step>
逐次実行の塊
<flow id="flowA" next="stepE">
<step id="flowAstepA" next="flowAstepB">...</step>
<step id="flowAstepB" next="flowAflowC">...</step>
<flow id="flowAflowC" next="flowAsplitD">...</flow>
<split id="flowAsplitD" next="flowAstepE">...</split>
<step id="flowAstepE">...</step>
</flow>
最後の step は next を持てない。flow の next に遷移するため
並列実行の塊
<split id="splitA" next="stepB">
<flow id="splitAflowA">...</flow>
<flow id="splitAflowB">...</flow>
<flow id="splitAflowC">...</flow>
</split>
<!-- Implemnts Decider -->
<decision id="decisionA" ref="MyDeciderImpl">
<fail on="FAILED" exit-status="FAILED_AT_DECIDER"/>
<end on="COMPLETED" exit-status="COMPLETED_AT_DECIDER"/>
<stop on="MY_TEMP_ISSUE_EXIST_STATUS" restart="step2"/>
<next on="
</decision>