しおしお

IntelliJのあれやこれや

JBeret SEで起動したJOBを停止する

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で見てみると

下の画像のように情報が参照できているのがわかる

f:id:sioiri:20170716142203p:plain

stop操作をしてみると

下の画像のようにstop要求が行われ、最終的にジョブが終了しプロセスがなくなっていることがわかる。
f:id:sioiri:20170716142307p:plain

ジョブリポジトリのbatchstatusもSTOPPEDに変更されているので、ジョブが停止されたことが確認できる。
f:id:sioiri:20170716142448p:plain

おわり。

*1:単純に別プロセスからJobOperator#stopしてみたけど、別プロセスから呼び出しても意味ないみたいでした。