[英]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()內的循環。
一些建議:
簡單的例子:
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.