簡體   English   中英

並行運行兩個JMX ManagedOperations

[英]Run two JMX ManagedOperations in parallel

我有使用jmx運行某些作業的簡單類。 我想實現啟動和停止此作業的功能(它可能運行很長時間)。 像這樣:

@Component
@ManagedResource
public class JobRunner
{
    private static boolean stopped = false;

    @ManagedOperation
    public void start()
    {
        stopped = false;
        while (!stopped)
        {
             // Some actions..
        }
    }

    @ManagedOperation
    public void stop()
    {
        stopped = true;
    }

}

不知道如何使它工作。 如何使這些方法在並行流中獨立運行,以及如何使stop()方法影響start()內的循環。

一些建議:

  1. 使用AtomicBoolean來跟蹤作業是否正在運行。
  2. 在線程中啟動作業,使其在后台運行,而不在JMX線程中運行(否則,啟動作業的JMX調用將被阻止)。
  3. 作業線程應該偶爾暫停,以便在停止時可以中斷。

簡單的例子:

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");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM