JSR352-Batch Applicationを試してみた(Chunkステップ編) - しおしおの続編で、今回は実行中のジョブの停止を試してみる。
実行中ジョブの停止方法
JobOperator#stopを呼び出すことで実行中のジョブが停止する。
sotpメソッドの引数には、停止対象のジョブ実行を識別するためのexecutionIdを指定します。executionIdは、ジョブの起動時に戻される値です。
stopメソッドを呼び出して、ジョブの停止要求を受け付けると、ジョブのステータスは停止処理中であることを示すSTOPPINGに変更されます。実行中のステップの処理を停止し、ジョブが停止されるとステータスはSTOPPEDに変更されます。
ジョブを停止させるサンプルコード
val jobOperator = BatchRuntime.getJobOperator() jobOperator.stop(executionId)
Batchletの処理を安全に中止する
ジョブの停止要求があると、Batchlet#stopがコールバックされるので、Batchlet#processの処理を安全に中断する必要がある。
サンプルコード
このバッチレットでは、processで処理の長いSQLが実行される。stop処理では、SQL文の実行をキャンセルするために、Statement#cancelを実行する。
override fun process(): String { // 処理の長いSQL文を実行する dataSource!!.use { statement = it.createStatement() statement.execute("select pg_sleep(30)") } return "OK" } override fun stop() { LOGGER.info("ジョブを停止します..... execution id={}, step={}, status={}", jobContext!!.getExecutionId(), stepContext!!.getStepName(), stepContext!!.getBatchStatus()) statement.cancel() }
実行結果ログ
ステータスが実行中(STARTED)から、中断を示す(STOPPED)に変わっています。
01:53:16,310 INFO [siosio.listener.LogStepListener] (Batch Thread - 4) step start... job=stoppable-batchlet, step=batchlet, status=STARTED 01:53:20,483 INFO [siosio.batchlet.StoppableBatchlet] (default task-15) ジョブを停止します..... execution id=120, step=batchlet, status=STOPPING 01:53:20,511 INFO [siosio.batchlet.StoppableBatchlet] (Batch Thread - 4) ステップの処理がキャンセルされました。 step=batchlet, status=STOPPING 01:53:20,514 INFO [siosio.listener.LogStepListener] (Batch Thread - 4) step end... job=stoppable-batchlet, step=batchlet, status=STOPPED
ジョブの状態を格納するテーブル上でも、バッチのステータスがSTOPPEDになっている。