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に変更されているので、ジョブが停止されたことが確認できる。
おわり。