0

如何使 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");
}
}
4

2 回答 2

0

您可以使用 Future isDone方法继续检查您的任务状态。一旦它返回true,您就可以退出。执行以下操作:

while(!scheduledFuture.isDone()) {
  // wait to return till the end of this loop
}

但是这里有一个风险,如果您的任务永远不会结束,那么您将永远无法返回并且 servlet 可能会超时。所以把适当的定时等待任务完成。

于 2013-10-06T01:05:13.767 回答
0

“继续工作”的经典方法就是生成一个新线程:

http://oreilly.com/catalog/jservlet/chapter/ch03.html

Servlet 可以做的不仅仅是在访问之间持久化。它们也可以在访问之间执行。任何由 servlet 启动的线程都可以在响应发送后继续执行。这种能力被证明对于长时间运行的任务最有用,这些任务的增量结果应该提供给多个客户端。在 init() 中启动的后台线程执行连续工作,而请求处理线程使用 doGet() 显示当前状态。它与动画小程序中使用的技术类似,其中一个线程更改图片,另一个线程绘制显示。

早在“ScheduledExecutorService”存在之前,情况就是如此。

问:ScheduledExecutorService(或简单线程)尚未提供的功能是什么?

于 2013-10-06T01:06:24.427 回答