Spring BatchをWEBから起動したい場合があるかもしれません。
または、サーバにBatchをおいておいて、他のサーバからキックだけしたい場合があるかもしれません。
こんなときは「非同期」で起動したくなると思います。
この記事ではSpringBatchを非同期で起動する方法を見てみます。
実はとっても簡単です。
【サンプル(SpringBatch設定ファイル一部抜粋)】
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
<property name="taskExecutor">
<bean class="org.springframework.core.task.SimpleAsyncTaskExecutor" />
</property>
</bean>
【起動例(プログラム)】
JobLauncher jobLauncher = (JobLauncher )applicationContext.getBean("jobLauncher");
Job job = (Job)applicationContext.getBean("job");
jobLauncher.run(job, new JobParameters());
【説明】
jobLauncherのtaskExecutorプロパティにSimpleAsyncTaskExecutorを設定すれば非同期になります。
簡単ですよね。
起動も簡単です。
jobLauncherのrunメソッドを呼ぶだけです!
その他の起動方法として、以下の記事でプログラムから起動する方法も記述しています。
・CommandLineJobRunnerとは?
【注意点】
コマンドラインから実行する場合、実行が終了すればJavaが落ち、StepやJobのインスタンスも解放されます。
でもWEBでバッチ実行する場合、StepやJobのインスタンスは当然解放されません。
そうすると、Stepの内部でファイルを扱えばそのインスタンスが残っている可能性もあります。
その状態でJobが再度起動され、同じStepが実行されればファイルの読み込み・書き込みがおかしくなるかも知れません。
そうするとStep毎にItemReaderやItemWriterなどのインスタンスが生成される方が良くなります。
このとき生きてくるのがSpringBatch用の新scopeである「step」です。
生成の問題の回避のため、ItemReaderやItemWriterなどのbeanのscope属性にstepを使用してみてください!
他の記事でちょくちょく使ってますのでサンプルを見てもらえればと思います。
【おまけ】
Spring Batchをサーバーにおいておいて、他のサーバからキックするという使い方もできます。
Spring RemoteでRMIなどでSpringBatchのJobを公開しておいて、他のサーバからそれをキックするという
やり方です。(Jobを起動する仲介者クラスさえ作ればうまく行きます)
そうするとバッチ処理を一箇所におけるので1つのやり方だと思います。
ただ、RMIなどは新しいバージョンをリリースしたい場合に停止しないといけないとかあるかもしれません。
RMIの機能を調べていないので分かりませんが、もしそうなら、WEBからバッチをキックしている場合、
WEBにも影響が行くことになり、リリースが大変になるかもしれません。
でも、何か他の方法があって、いいやり方があるかもしれません。
いろいろ発展性はありそうで、面白そうですよね!
参照:
・Spring Batchを使えるようにするには? (準備編)
・データの書き込み(コミット)タイミングを制御するには? (restart機能もついでに見る!)