日付などでステップの条件分岐ができるようにする部品
SpringBatchでは、ステップの処理結果によって次に実行するステップを変更することができます。
処理結果は、成功、失敗のようなものから、自分で自由な文字列を指定することもできます。
自分で自由に文字列を指定したい場合、リスナーかTaskletの処理で自分でコードを書く必要があります。
たいていの場合、自分でコードを書くことは難しくありません。
しかし、日付による次のステップの決定などは汎用化できそうですし、汎用化しておいて自作するのを避けられると助かることが多そうです。
ここで紹介しますConditionTaskletクラスは、少し汎用化した部品です。
システム日付や入力パラメタなどを入力として、指定の文字をStatusとして返すようにしてくれます。
例えば、ジョブ起動日が10日でしたら"NEXT"を返し、それ以外でしたら"SKIP"を返すようにできます。
これとnextタグなどと組み合わせると目的を実現できます。
以下では、具体的に利用方法を見ていきます。
目標
まず、以下のサンプルの目標(ゴール)を示します。
ジョブ起動時に、Jobパラメタに日付を入力してもらいます。
yearmonthパラメタの日付が10日のときはstep2に進み、それ以外はstep3に進む、という動作をするようにします。
使用サンプル
<バッチ処理設定ファイル(一部抜粋): /test/job-context.xml>
<job id="job" xmlns="http://www.springframework.org/schema/batch" incrementer="jobParametersIncrementer">
<step id="skip1" >
<tasklet ref="monthOf10ConditionTasklet"/>
<next on="SKIP" to="step3" />
<next on="*" to="step2"/>
</step>
<!-- 10日のときだけ何か実行する-->
<step id="step2" next="step3" .../>
<!-- いつでも何か実行する-->
<step id="step3" .../>
</job>
<bean id="monthOf10ConditionTasklet" class="jp.co.soracane.batch.core.step.tasklet.ConditionTasklet" scope="step">
<property name="input" value="#{jobParameters['yearmonth']}" />
<property name="delegationDecision">
<bean class="jp.co.soracane.commons.decision.WildCardMapDecision">
<property name="params" value="
*10=NEXT,
*=SKIP
" />
</bean>
</property>
</bean>
上記のように設定するとJobパラメタのyearmonthパラメタの値を元にして、返却するStatusをNEXTとSKIPとわけてくれます。
値のマッピングは、WildCardMapDecisionを使用しています。
これは、inputプロパティを引数にして、値をマッピングしてくれる部品です。
「*10=NEXT」は、日付の文字列が、10で終わるときに"NEXT"という文字列に変換することを表しています。(例: 20100110)
こうして、10日のときのみstep2を実行するようにできます。
ConditionTaskletはタスクレットですので、ステップで記述します。
<コマンド実行サンプル>
>CommandLineJobRunner classpath:/test/job-context.xml job yearmonth=20100110
最後に
ジョブを作成すると、ある日のみ実行する処理が結構あります。
JP1などを使用すればそれは解決できますので、SpringBatchの設定を細かく分けて、JP1などのジョブスケジューラに登録するのが一番いいような気がします。
しかし、JP1はパッケージ製品でお金もかかります。
いつでも使用できるとは限りません。
上記のような部品はちょっとした機能ですが、ある程度やりたいことを解決してくれるかと思っています。
また、soracaneでは、Jobパラメタのデフォルト値を設定するCoverterを用意しています。
そちらと組み合わせるとシステム日付をパラメタに設定することができます。そうすることで、システム日付が10日のときに条件分岐する、ということも可能になってきます。
参考: Jobパラメタにデフォルト値を用意したり、他の値に変換する部品
Created Date: 2010/01/10