JBeret SEで起動したJOBをJMXを使って停止させてみる。*1
MXBeanを作る
インタフェースと実装はこんな感じに。
とりあえず、executionIdとステータスやジョブ名を参照できるようにして、操作としてstopを定義してみた。
インタフェース
public interface JobControllerMXBean { void stop(); Long getExecutionId(); String getJobName(); String getBatchStatus(); }
実装
public class JobController implements JobControllerMXBean { private final JobExecution jobExecution; public JobController(final JobExecution jobExecution) { this.jobExecution = jobExecution; } @Override public void stop() { BatchRuntime.getJobOperator().stop(getExecutionId()); } @Override public Long getExecutionId() { return jobExecution.getExecutionId(); } @Override public String getJobName() { return jobExecution.getJobName(); } @Override public String getBatchStatus() { return jobExecution.getBatchStatus().name(); } }
JOBの実行とMXBeanの登録
sampleジョブを実行しつつ、JobExecutionを持つMXBeanを登録する。
fun main(args: Array<String>) { val mbs = ManagementFactory.getPlatformMBeanServer() val jobOperator = BatchRuntime.getJobOperator() val executionId = jobOperator.start("sample", null) val jobExecution = jobOperator.getJobExecution(executionId) val jobController = JobController(jobExecution) val name = ObjectName("siosio:type=JOB") mbs.registerMBean(jobController, name) (jobExecution as JobExecutionImpl).awaitTermination(0, TimeUnit.SECONDS) }
JConsoleで見てみると
下の画像のように情報が参照できているのがわかる
stop操作をしてみると
下の画像のようにstop要求が行われ、最終的にジョブが終了しプロセスがなくなっていることがわかる。
ジョブリポジトリのbatchstatusもSTOPPEDに変更されているので、ジョブが停止されたことが確認できる。
おわり。
*1:単純に別プロセスからJobOperator#stopしてみたけど、別プロセスから呼び出しても意味ないみたいでした。