如何使servlet在销毁之前等待当前任务完成?
更新了......
@WebListener
public class EmailServlet implements ServletContextListener {
private ScheduledExecutorService executorService;
ScheduledFuture scheduledFuture;
private int delay = 300000;
private int repeat = 300000;
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("The email servlet started");
executorService = Executors.newSingleThreadScheduledExecutor();
scheduledFuture = executorService.scheduleWithFixedDelay(new Task3(), delay, repeat, TimeUnit.MILLISECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduledFuture.cancel(true);
executorService.shutdown();
System.out.println("The email servlet stopped");
}
}
答案 0 :(得分:0)
您可以使用Future isDone方法继续检查您的任务状态。一旦它返回true,你就可以退出。做类似的事情:
while(!scheduledFuture.isDone()) {
// wait to return till the end of this loop
}
但这里存在风险,如果你的任务永远不会结束,那么你将永远无法返回,而servlet可能会超时。因此,请将适当的定时等待任务完成。
答案 1 :(得分:0)
“继续工作”的经典方法只是产生一个新线程:
http://oreilly.com/catalog/jservlet/chapter/ch03.html
Servlets不仅可以在访问之间保持简单。他们能 也在访问之间执行。 servlet启动的任何线程都可以 即使在发送响应后仍继续执行。这种能力 证明对于增量结果的长期任务最有用 应该可供多个客户使用。背景线程 在init()中启动,在请求处理时执行连续工作 线程使用doGet()显示当前状态。这是一个类似的 动画小程序中使用的技术,其中一个线程发生变化 图片和另一个画出了画面。
在“ScheduledExecutorService”存在之前很久就已经存在。
问:你想做什么,ScheduledExecutorService(或一个简单的线程)还没有提供?