しおしお

IntelliJ IDEAのことなんかを書いてます

JSR352-Batch Applicationを試してみた(ジョブの停止-Chunk)

Chunckステップ実行中にバッチジョブを停止する方法。

基本的な考え方やステータスの遷移は、Batchletの停止と同じ。違いは、Chunkの場合はBatchletのような停止用の実装を行う必要はないこと。

Chunkの場合は、Writerが処理中の場合はWriterの処理が終わり次の塊のデータを読み込んだあとにジョブが停止される。*1

もし、chunkのそれぞれの処理(readerやwriter、processorなど)が終わらない場合、ジョブの停止要求を出しても自動的にジョブは終わらないので、それぞれの処理が終わらない原因を取り除く必要がある。
例えば、データベースのロック待機などで永遠にクライアントに処理が戻ってこない場合には、停止要求を出してもジョブは停止しない。

ItemReadListenerで動きを確認してみる

ItemReadListenerでは、Itemリード後のコールバック処理でリードしたitemの内容とジョブのステータスを標準出力に書き込んでいる。

  @Inject
  lateinit val jobContext:JobContext

  override fun afterRead(item: Any?) {
    item?.let {
      println("read item = ${item}, job status = ${jobContext.batchStatus}")
    }
  }

Chunkのitem-countを5で実行した場合で、4件目のレコードを読込中のジョブの停止命令を出した場合のログの内容。4件目のレコードを読み込んだあとのジョブのステータスは停止中を表すSTOPPINGになり、5件目のレコードは読み込まずに今まで読み込んだitemがwriterに渡され処理されているのがわかる。

23:09:27,474 INFO  [stdout] (Batch Thread - 1) read item = 1, job status = STARTED
23:09:32,485 INFO  [stdout] (Batch Thread - 1) read item = 2, job status = STARTED
23:09:37,487 INFO  [stdout] (Batch Thread - 1) read item = 3, job status = STARTED
23:09:42,491 INFO  [stdout] (Batch Thread - 1) read item = 4, job status = STOPPING
23:09:42,500 INFO  [stdout] (Batch Thread - 1) it = 1
23:09:42,500 INFO  [stdout] (Batch Thread - 1) it = 2
23:09:42,500 INFO  [stdout] (Batch Thread - 1) it = 3
23:09:42,501 INFO  [stdout] (Batch Thread - 1) it = 4

ジョブ停止後のジョブリポジトリの状態

Chunkステップ処理中にジョブを停止すると、ジョブリポジトリ(step_executionテーブル)にステップの処理状態が記録される。
以下のように、何件目まで正常に処理できたかなどが記録される。この情報は、停止したジョブをリスタートした場合の再開ポイントとして利用される。
f:id:sioiri:20150925145845p:plain

おわり。

*1:jberetの場合