我需要创建一个无限运行的线程,作为一个带有Spring MVC控制器的独立进程。
线程将在第一次触发控制器时启动。每次控制器被击中时我都不想重新安排。
@RequestMapping(method = RequestMethod.GET)
public String runTask() {
//I want this to be scheduled first time controller is hit but
//I don't want it to rechadule every time it is hit again
ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
exec.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// do stuff
}
}, 0, 5, TimeUnit.SECONDS);
return "Task was scheduled to run";
}
有更好的方法吗?
答案 0 :(得分:0)
只需将其添加到控制器
即可@PostConstruct
public void init(){
//call executor here
}
答案 1 :(得分:0)
您可以分离线程执行的逻辑和控制器初始化执行程序,如下所示:
public class MapDecoratorQueue {
//inject it
MyXExecutor myXExecutor;
@RequestMapping(method = RequestMethod.GET)
public String runTask() {
myXExecutor.setRunning(true);
return "Task was scheduled to run";
}
}
//Inject this into MapDecoratorQueue in spring config
class MyXExecutor{
private final ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
private volatile boolean isRunning = false;
public MyXExecutor(){
exec.scheduleAtFixedRate( new Runnable(){
@Override
public void run() {
if(isRunning){
//do stuff
}
}
}, 0, 5, TimeUnit.SECONDS);
}
public void setRunning(boolean running) {
isRunning = running;
}
}
将运行逻辑置于isRunning值的检查之下。如果你不想首先启动执行程序,直到你第一次命中,你可以使用相同的方法,你可以从控制器调用一个方法,如果它没有初始化,将启动执行程序。
希望这有帮助。