しおしお

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

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

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()
  }

Batchletの全コード

実行結果ログ

ステータスが実行中(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になっている。
f:id:sioiri:20150725015600p:plain

stopメソッド実装しなかったらどうなる?

stopメソッドを実装しないと、Batchlet#processの処理が終わるのを永遠と待ち続ける。stop要求時に即処理を停止したいなら、stopメソッドを実装する必要がある。

おわり。