この記事の前に1つ前の記事を読んでみてください。
ここでは、実際にSpringBatchで処理を作るための概要を見ていきたいと思います!
【プログラマーがやること(概要)】
やることは主に以下のことです。
①Stepの中身をプログラムする。
(StepはSpringにおける処理の単位。1つ前の記事 参照)
②SpringのApplicationContextファイルに、処理の仕方(条件分岐、順番、並列かシーケンシャルか)などを
Step単位で記述する。
【①Stepについて(概要)】
Stepはさらに3つの処理を持っています。
<3つの処理の説明>
ItemReader ・・・データの読み込みを担当するクラス
ItemProcessor ・・・読み込んだデータの処理を担当するクラス。(例えば日付の書式を変えるなど)
ItemWriter ・・・処理したデータをどこかに書き込む処理を担当するクラス。
<説明>
上記3つのクラスはinterfaceですので、実装は各interfaceをimplementsして作ります。
そして、 ①で取得した1つのデータを ⇒ ②で処理し ⇒ ③で書き込む。
この①~③の操作を①の読み込みでデータがなくなるまで繰り返します。
これが1つのstepです。
付け加えておくと、3つのクラスはSpringで最初から用意しているクラスもあります。
例えば、ItemReaderには、CSVファイルからデータを取得するクラスが用意されています。
これらを使用できるケースであれば、ItemProcessorくらいしか作る必要がなくなります。
便利ですね![]()
【②処理の記述について (ApplicationContextファイルの作成)】
SpringのApplicationContextにはSpringBatchのためにいくつかのタグが追加されたようです。
以下では正確な記述ではないですが、設定ファイルの書き方の雰囲気を見ていきましょう。
前回の概要の記事 で出てきた登場人物も出てきます。
リポジトリの設定
<job-repository id="jobRepository"
data-source="dataSource"
transaction-manager="transactionManager"
isolation-level-for-create="SERIALIZABLE"
table-prefix="BATCH_"
/>
JobLauncherの設定
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property ref="jobRepository" name="jobRepository" />
</bean>
トランザクション処理
<aop:config>
<aop:advisor
pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"
advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
ジョブの設定 <job id="sampleJob"> <step id="step1"> <tasklet> <chunk reader="itemReader1" writer="itemWriter1" commit-interval="10"/> </tasklet> </step> <step id="step2"> <tasklet> <chunk reader="itemReader2" writer="itemWriter2" commit-interval="10"/> </tasklet> </step> </job>
<簡単な説明>
最初に、
Execution の保存・取得先であるリポジトリの設定をしています。
Executionは、バッチ処理の結果を保持するクラスです。StepExecution、JobExecutionなどがあります。
次に、
トランザクションの設定をしています。
この部分はたいていのSpringバッチの処理では同じ記述になるとのことです。
トランザクションがcommit/rollbackされる単位はチャンク(chunk)と呼ばれる単位です。
チャンクはstepタグの中で設定されます。
最後に、
本命であるJobの処理を設定しています。
Jobは複数のstepを持っています。
そしてstepはItemReader, ItemProcessor, ItemWriterを1つずつ持っています。
ここではItemProcessorは記述していませんが、処理が何もない場合は記述しないこともできます。
chunkについては以下でもう少し説明します。
【Step内のchunkについて】
commit-intervalは、ItemReaderを10回実行する毎にItemWriterが呼ばれ、書き込みとcommitをする、ということを指しています。
つまり、10回を1チャンクとして処理がされます。
処理イメージは以下のとおりです:
List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
Object item = itemReader.read();
item = itemProcessor.process(item);
items.add(item);
}
itemWriter.write(items);
※read/processは上記では2回しか繰り返してませんが、
【プログラムの起動】
では、一生懸命設定し、作成したプログラムを起動してみましょう!
SpringBatchでは、コマンドラインから実行するためのクラスが用意されています。
このクラス内にはmain関数が用意されているため、以下のように使用できます。
> java CommandLineJobRunner applicationContext.xml sampleJob target(date)=2010/01/01
applicationContext.xml内に設定したJobLauncherを利用して、指定したjob名「sampleJob」を実行します。
コマンドライン以外にも、WEBから非同期にJobを実行することもできるようですが
ここでは省略します。
さて、なんとなく全体的な処理とやらないといけないことが分かりましたでしょうか?
もしうまく伝わっていましたらとっても嬉しいです![]()
参照:
・Executionとは? (SpringBatch用語)