ステップ実行するためにSpringBatchを動かせるようにする

ソース読み進めていくのに、ステップ実行したくなってきました。 JUnitでもよかったのですが、トータル的な流れでみたかったので、 CommandLineJobRunnerを使ってジョブを流せるようにします。 (コマンドラインつってもEclipseですが)   ■ SpringBatchプロジェクトを作る File→New→Spring Template Project→Simple Spring Batch Project 上記でmaven的なプロジェクトが生成されます。   RDBMSMySQLを使う SpringBatchはJobやStepがどうやって実行された的なところをRDBMSに保持します。 デフォルトではHSQLDB(Javaで出来た楽に使えるRDBMS)になっているのですが、 自分のとこはMySQLでやってるので、そっちにします。 変更点は以下3点。   1. pom.xml HSQLDBを止めて

<!--
<dependency>
 <groupId>hsqldb</groupId>
 <artifactId>hsqldb</artifactId>
 <version>1.8.0.7</version>
</dependency>
-->

MySQLにします

<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.6</version>
</dependency>

後は勝手にmavenがよろしくやってくれます。   2. batch.properties ↓ドライバをMySQLにして、あとは環境に合わせて。

batch.jdbc.driver=com.mysql.jdbc.Driver
batch.jdbc.url=jdbc:mysql://localhost:3306/springbatch
batch.jdbc.user=root
batch.jdbc.password=
#batch.schema=springbatch
#batch.schema.script=classpath:/org/springframework/batch/core/schema-mysql.sql

スキーマスクリプトは後術しますがコメントアウトしておきます。 batch.propertiesの定義をlaunch-context.xmlが読んで~という形になりますが、 複数コネクションを取得してーとかって時に、この部分が参考になりそうです。   3. launch-context.xml 一番下に dataSourceInitializer ってのが上記のスキーマスクリプトを元に 起動時にDDLを流してくれるのですが、2回目以降は already exists とか言われるので、 コメントアウトしておきます。 自分の場合は1回目に起動擦る前に spring-batch-core-2.x.x.jar の schema-mysql.sql を使って 以下のように直接DDL流したので特に必要ありませんでした。

mysql -u root -D springbatch < schema-mysql.sql

  ■ Jobの定義 META-INF/spring/module-context.xml にJobの定義が書かれています。 一つのXMLファイルに複数ジョブを定義できるかやってみたかったのでjob2とか追記してみます。 (内容はjob1と全く同じ)

<job id="job2" xmlns="">http://www.springframework.org/schema/batch">
 <step id="step2" parent="simpleStep">
  <tasklet>
   <chunk reader="reader" writer="writer"/>
  </tasklet>
 </step>
</job>

  ■ 実行する Run As→Run Configurations Main class  org.springframework.batch.core.launch.support.CommandLineJobRunner  CommandLineJobRunnerが何やるクラスか?ってのは、  昨日のエントリに書きやした。

ArgumentsのProgram arguments  launch-context.xml job2  第一引数はJob定義が書いてあるXML。第二引数はジョブ名   ジョブ定義は module-context.xml に書いたのに、 なんでlaunch-context.xml を指定するのか?っていうと↓。 1. launch-context.xmlがmodule-context.xmlをimportしていて、

<import resource="classpath:/META-INF/spring/module-context.xml" />
  1. launch-context.xmlを指定しないとlaunch-context.xmlで定義しているbeanの定義が解釈されないので、  ジョブ実行時にNo such何チャラ的に怒られる   =======   と、まぁ、ジョブの起動まではこんな感じで、処理を実行するとデロデロってスタックトレースがでて、 BATCH_JOB_EXECUTIONテーブルとか見ても開始時間や終了時間やステータスがCOMPLETEDになっています。   で、調子に乗って連続で実行しようとすると↓のように怒られたりして、
org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException: A job instance already exists and is complete for parameters={}.  If you want to run this job again, change the parameters.

試しに起動引数に -restart とかやってみたら、

java.lang.IllegalStateException: A JobExplorer must be provided for a restart or start next operation.  Please add one to the configuration.

とか言われたりするので、この辺はマニュアルみながら、使い方トレースしていかないと いけないですね。。   ともあれ、これでステップ実行しながら追いかける環境を作ることが出来ました。