Jobパラメタにデフォルト値を用意したり、他の値に変換する部品

SpringBatchのJobパラメタにデフォルト値を設定することはできません。

また、パラメタに設定された文字列をプログラムで使用するコード値に変換する機能もありません。

コマンドには、それらの機能は通常必要になります。

soracaneが提供するOptionJobParametersConverterは、Converterを拡張したクラスで、これらの機能を実現してくれる部品です。

以下では、具体的にその利用方法を見ていきます。

目標

まず、以下のサンプルの目標(ゴール)を示します。

目標は、ジョブパラメタを変換することを目標とします。

例えば以下のような起動を実施したとします。

【実行記述】

>CommandLineJobRunner classpath:/test/job-context.xml job name=JAPAN @key=foo

Jobパラメタは、name、id、date、@key とします。

nameにJAPANを指定すると、11というコードに変換します。(AMERICAの場合は2、KOREAの場合は5、その他は0)

idは指定なしにすると、0というデフォルト値が設定されるようにします。

dateは指定なしにすると、システム日付がデフォルト値として設定されるようにします。

@keyを指定すると、削除されるようにします。

結局以下のように起動したのと同じになります。

【変換後】

>CommandLineJobRunner classpath:/test/job-context.xml job name=11 id=0 date=20100111

使用サンプル

<バッチ処理設定ファイル(一部抜粋): batch-context.xml>

<!-- JobパラメタConverter -->

<bean id="optionJobParametersConverter" class="jp.co.soracane.batch.core.OptionJobParametersConverter" >

<property name="changeValues" >

<map>

<entry key="name" value-ref="namaMapDecision"/>

</map>

</property>

<property name="defaultValues" >

<map>

<entry key="id" value="0"/>

<entry key="date" value-ref="nowDateString"/>

</map>

</property>

<property name="deleteKeys" value="@key" />

</bean>

<!-- システム日付を取得するクラス -->

<bean id="nowDateString" class="jp.co.soracane.commons.decision.NowDateString">

<constructor-arg index="0" value="yyyyMMdd" />

</bean>

<!-- nameのコードマップのサンプル -->

<bean id="namaMapDecision" class="jp.co.soracane.commons.decision.WildCardMapDecision">

<property name="params" value="

JAPAN=10,

AMERICA=2,

COREA=5,

*=0

" />

</bean>

上記ではSpringBatchに設定するJobConverterのみ記述しています。

他は普通どおりに設定を記述してください。

CommandLineJobRunnerは、クラスの型を探してJobParameterConverterが見つかれば使用するという仕様になっています。

ですので、上記の設定を追加すれば自動で使用してくれます。

ただし、型で検索をするので複数のJobParameterConverterが存在する場合はエラーになります。

【jobParameterConverter】

JobParameterConverterは、コマンドの引数をJobParametersに変換したり、逆にJobParametersからコマンド引数に戻したりする部品です。

OptionJobParametersConverterは、コマンドの引数をJobParametersに変換するときにコード変換をかけたり、デフォルト値を追加したりします。

deleteKeysにはワイルドカードも使用できます。

詳しくはjavadocをご覧ください。

【nowDateString】

システム日時を指定の書式文字列にするクラスです。

【namaMapDecision】

ワイルドカードによる変換表です。引数(この場合は"JAPAN")を元に他の文字列に変換をかけます。

ここでは、このクラスに渡す引数はJobパラメタのパラメタ値になります。

もし、CommandLineJobRunnerではなく、JobOperatorで起動するような場合は、設定を以下のように書き直します。

【JobOperatorで起動する場合のサンプル】

<bean id="jobOperator"

class="org.springframework.batch.core.launch.support.SimpleJobOperator"

p:jobLauncher-ref="jobLauncher" p:jobExplorer-ref="jobExplorer"

p:jobRepository-ref="jobRepository" p:jobRegistry-ref="jobRegistry"

p:jobParametersConverter-ref="optionJobParametersConverter" />

<コマンド実行サンプル>

>CommandLineJobRunner classpath:/test/job-context.xml job test=aa name=JAPAN @key=削除されます

コマンド実行は普通どおりに行います。

最終的にジョブが起動されるときは、以下のようなJobパラメタになっているはずです。

id=0

name=10

date=20100111 (システム日付が設定されます)

test=aa

上記で紹介したConverterを利用すると、起動のたびにJobパラメタに日付を自動で追加することができます。

ですので、起動日毎に違うJobInstanceにすることができます。

通常SpringBatchは、JobInstanceを別にしなければ起動できませんのでこれはかなり便利だと思います。

最後に

パラメタを削除する必要があるのか?と疑問に思ったかもしれません。

通常SpringBatchは、Jobパラメタが違う場合は違う起動とみなされるため、JobInstanceが別の値になってしまいます。

あるパラメタに変更があっても新しいJobInstanceを生成したくない場合に、パラメタ削除が有効になるかと思います。

なお、削除したパラメタを使用したい場合はcallbackを呼び出します。soracaneではcallbackとしてJobExecutionContextに削除したパラメタを設定する部品もあります。

@が付いたパラメタをオプション値のように利用することも可能になります。

【例:出力ファイルの設定によってJobInstanceを変えたくない場合のサンプル】

<job id="job" xmlns="http://www.springframework.org/schema/batch" incrementer="jobParametersIncrementer">

<listeners>

<listener ref="copyListener" />

</listeners>

<!-- 何か実行する-->

<step id="step1" ... />

</job>

<!-- JobパラメタConverter -->

<bean id="optionJobParametersConverter" class="jp.co.soracane.batch.core.OptionJobParametersConverter" >

<property name="deleteKeys" value="@file" />

<property name="callback" ref="copyListener" />

</bean>

<bean id="copyListener" class="jp.co.soracane.batch.listener.DeletedParameterCopyListener" />

>CommandLineJobRunner classpath:/test/job-context.xml job date=20100110 @file=c:/temp/result.txt

このようにすると、例えファイルパス(@file)が変わっても、同じ日付(date)に対しては1度しか起動しなくなります。(@fileが削除されてJobInstanceが同じになりますので)

このあたりは設計の決めの問題になりますが、設計の幅が広がるかと思います。

リスナーは、デフォルトではJobExecutionContext[option.params]に削除したパラメタを保存します。

ですので、利用したい場合はここから値を取得してください。

Created Date: 2010/01/10