CommandLineJobRunnerとは? | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

CommandLineJobRunnerは、Spring Batchで用意されているmain関数を持ったクラスです。


Spring Batchはバッチ処理の流れや条件分岐をXMLの設定ファイルに記述するだけでバッチ処理を表現できます。

実際にそのXMLを実行する方法の1つが、CommandLineJobRunnerなのです。

もちろんSpringBatchのjarが必要ですので、それをダウンロードしておく必要はあります。



【起動方法】

以下に起動例を記述します。


java org.springframework.batch.core.launch.support.CommandLineJobRunner testJob.xml testJob schedule.date=2008/01/24 type=2


 記述方法:

  [バッチのXML設定ファイル] [Job名] [オプション] [パラメタ(0個以上)]


  例題でのそれぞれの値は以下のとおり。

   [バッチのXML設定ファイル] ・・・ testJob.xml

   [Job識別子] ・・・ testJob

   [パラメタ(0個以上)] ・・・ schedule.date=2008/01/24 と type=2


 上記のような感じで実際にコマンドラインから実行できます。

 [Job識別子]は、バッチXMLファイル内でjobタグで設定されているid名(ジョブ名)、

 もしくは実行後にできるJob実行ID(数字)のいづれかを指定できます。

 [Job識別子]に数字が指定された場合にJob実行IDとみなされ、それ以外はジョブ名とみなされます。

 オプション(-restartなど)を指定する場合は、基本的にはパラメタを指定しません

 オプション指定時はパラメタは基本的に無視されるようですが、-nextオプションだけ特殊です

 詳しくは以下の「オプションについて」を参照ください。

 ちなみにバッチXMLファイルは、Springのcontextファイルです。

  


【オプションについて】

上記ではオプションを使用していませんが、以下のようなオプションを使用可能です。
-restart

指定したJob名で、最後にFAILまたはSTOPした実行結果(JobExecution)を検索して再実行します。

再実行は、最後に失敗したステップからリスタートします。

ステップがチャンク処理の場合は、最後にコミットした次のチャンクからリスタートします。

このオプションでは、パラメタを設定しても無視されます。

再実行時のパラメタには、見つかったJobExecution内のパラメタ(JobParameters)が使用されます。

Job名に数字を指定するとJobExecutionのID(Job実行ID)とみなされて、対応するJobExecutionを検索して再実行します。

-stop

実行中の処理を停止します。

指定したJob名に一致する、実行中のジョブをすべて停止します。このオプションではパラメタを設定しても無視されます。

Job名に数字を指定するとJobExecutionのIDとみなされて、対応するJobExecutionを検索して停止します。

停止した場合は、-restartオプションで再実行することが可能です。

-abandon

停止(stop)した処理を放棄します。

指定したJob名に一致する、停止中のジョブをすべて放棄します。このオプションではパラメタを設定しても無視されます。

Job名に数字を指定するとJobExecutionのIDとみなされて、対応するJobExecutionを検索して放棄します。

放棄された処理は再実行することはできなくなります。

-next

指定したJob名に一致するもののうち、最後に実行した実行結果(JobExecution)を検索し、処理を強制実行します。

Job名に数字を指定するとJobExecutionのIDとみなされて、対応するJobExecutionを検索して強制実行します。

もしパラメタを指定された場合は、検索したJobExecutionのパラメタに上書きして強制実行することができます。

【補足】

通常、既に完了(COMPLETED)しているパラメタで起動しようとするとAlreadyCompleteExceptionが発生します。これは同じパラメタに対しては同じJobInstanceのidを生成するからです。

しかし、このオプションを指定すると強制的に実行しようとします。

一度COMPLETEDしたジョブを開始する方法は、このオプションを使用するほかに、SimpleStepFactoryBeanクラスのallowStartIfCompleteプロパティをtrueにする方法もあるようです。

参考:・SpringBatch機能について


 ※Job名を指定した場合も、JobExecutionのIDを指定した場合も、1件もJobExecutionが見つからない場合はエラーになります



【その他のJobの実行方法1

上記以外のJobの実行方法は、プログラムから直接呼ぶ方法があります。

タイトルの内容とはそれるので軽く触れるにとどめます。


起動方法は、JobLauncherで呼び出します。

JobLauncherはSpringの設定ファイル内に記述できます。

上記のコマンドラインでもSpringの設定ファイル内にJobLauncherを記述しなければなりませんが、コマンドラインを使用する場合は1つしか記述できません。


 使用例: パラメタなしの場合

  jobLauncher.run(job, new JobParameters());


また、コマンドラインでは-nextなどのオプションを指定できましたが、それはコマンドラインの機能です。

もしjobLauncherで同じことをしたい場合、自分でJobParametersのインクリメントをする必要があります。

もしくは、CommandLineJobRunnerをnewしてstart()メソッドをオプションを指定して呼び出してもできるかもしれません。



【その他のJobの実行方法2

もうひとつの方法は、JobOperatorを使用する方法です。

実際に検証していないのでSpringBatchのドキュメントとサンプル(JobOperatorFunctionalTests)を参考に書きます。(各自で検証お願いします)


 使用例: パラメタなしの場合

  jobOperator.start("testJob", new JobParameters())

 使用例2: resrartする場合(stopも同様)

  List<Long> instances = jobOperator.getJobInstances("testJob", 0, 1);

  List<Long> executions = operator.getExecutions(instances.get(0));

  jobOperator.restart(executions.get(0));


 使用例3: -nextと同様の実行をする場合

  jobOperator.startNextInstance("testJob");



jobOperatorはSpringの設定ファイルに設定しておき、取得するものとします。

さて、JobOperatorは内部でJobLauncherを使用してJobを実行します。


パラメタなしの例は直感的に分かるかと思いますので、restartする場合を見てみましょう。


まずgetJobInstancesでインスタンスIDを取得しています。

引数は、ジョブの名前、何番目に生成したIDから取得するか、何個取得するか、の3つです。

2番目の引数は、0が最新で、数が大きくなるほど古くなります。

SpringBatchでは、同じジョブ名でも違うパラメタで実行すれば違うインスタンスIDが生成されDBに溜まっていきます。

それを新しいもの順に並び替えて取得するため、上記の場合、最後に実行したジョブインスタンスID1個を取得する例になります。

さらにそれを利用して次のステップでも同様にしてExecutionのIDを取得しています。

(failしたジョブを同じパラメタでrestartしたり、同じパラメタで-nextで実行した場合、ジョブインスタンスIDは同じですが、ExecutionのIDはインクリメントされてDBに溜まっていきます。)

restartメソッドに取得したIDを渡せばリスタート開始です!


コマンドの-nextと同様の起動するのはもっと簡単で、startNextInstanceを呼ぶだけです。

失敗したものが過去にあっても無視して新しいJobInstaceを作成します。



参照:

・トップ

・SpringBatch機能について

・バッチ処理を非同期で起動するには?

・実際に作成するものとは(Stepの概念について)

・Executionとは? (SpringBatch用語)

本家SpringBatchのCommandLineJobRunnerの記事