并行运行两个JMX ManagedOperations

时间:2018-03-15 09:39:18

标签: java multithreading jmx

我有使用jmx运行某项工作的简单课程。我想实现启动和停止这项工作的功能(它可能会运行很长时间)。像这样:

sess.run()

没有想法如何让它发挥作用。如何使这些方法在并行流中独立运行,并使方法stop()影响start()内的循环。

1 个答案:

答案 0 :(得分:0)

一些建议:

  1. 使用AtomicBoolean来跟踪作业是否正在运行。
  2. 在一个线程中启动作业,使其在后台运行,而不是在JMX线程中运行(否则启动作业的JMX调用将阻止)。
  3. 作业线程应偶尔暂停,以便在停止时可以中断。
  4. 简单示例:

    import java.util.concurrent.atomic.AtomicBoolean;
    import org.springframework.jmx.export.annotation.ManagedOperation;
    import org.springframework.jmx.export.annotation.ManagedResource;
    import org.springframework.stereotype.Component;
    
    @Component
    @ManagedResource
    public class JobRunner
    {
        private final AtomicBoolean stopped = new AtomicBoolean(true);
        private Thread jobThread = null;
    
    
    
        @ManagedOperation
        public void start() {
            if(stopped.compareAndSet(false, true)) {
              jobThread = new Thread("JobThread") {
                public void run() {
                  while(!stopped.get()) {
                    // Some actions..
    
                    // Occassionally pause so the job can be interrupted
                    try {
                      Thread.currentThread().join(100);
                    } catch (InterruptedException iex) {
                      if(!stopped.get()) {
                        System.err.println("Job Thread was interrupted but not stopped");
                        JobRunner.this.stop();
                        break;
                      }
                    }
                  }
                }
              };
              jobThread.setDaemon(true); // Optional
              jobThread.start();
            } else {
              throw new IllegalStateException("Job was already running");
            }
        }
    
        @ManagedOperation
        public void stop() {
            if(stopped.compareAndSet(true, false)) {
              jobThread.interrupt();
              jobThread = null;
            } else {
              throw new IllegalStateException("Job was not running");
            }
        }
    }