我有一个ScheduledExecutorService
,我每15分钟执行一次任务(在Tomcat的Web应用程序中)。
在ServletContextListener
contextDestroyed
中我完成了:
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
scheduler.shutdown();
}
});
调度程序启动如下:
final Runnable r = new Runnable(){
@Override
public void run() {
System.out.println("My task");
//Do some task
}
};
updater.scheduleWithFixedDelay(r, 30, 15, TimeUnit.MINUTES);
问题:在shutdown
上,任何剩余的任务都没有执行
有一个任务正在运行,但我没有看到任何日志,因此似乎没有执行。为什么?
更新
如果我启动tomcat然后在2分钟后我关闭然后是不是按计划考虑的任务并且必须运行?我的意思是,如果提交的任务不被视为未决?或者它必须实际运行?
答案 0 :(得分:1)
要明确等待所有正在运行的任务完成,请执行以下操作:
try {
// Wait for one second indefinitively
while (!scheduler.awaitTermination (1, TimeUnit.SECONDS)) {
// wait until completion
}
} catch (final InterruptedException ex) {
// interrupted... you may log something
}
答案 1 :(得分:0)
我无法完全解析你的问题,但也许你的应用程序没有像你期望的那样退出?
关闭Executor
将停止提交任何任务,但任何正在运行的任务将继续运行,直到退出。来自shutdown()
javadocs:
启动先前提交的有序关闭 任务已执行,但不会接受任何新任务。 如果已经关闭,调用没有额外的效果。
如果您将问题编辑得更清楚,我们可以更恰当地回答。