我有一个Servlet应用程序,它在init()
方法中生成工作线程。这些工作人员不断从事交易工作,即每项工作如果已经完成或未开始就很重要。
我希望我可以使用destroy()
方法以优雅的方式停止这些工作线程,即在结束destroy()
方法并终止之前确保它们已完成任何上一个/当前作业的servlet。
当Chef脚本执行destroy()
service tomcat7 stop
但是从我的日志/测试中,我的Servlet上的destroy()
方法没有阻止/完成。它被触发,但过了一会儿,tomcat关闭了,我没有收到线程以优雅的方式停止的确认。
public void destroy() {
log.info("Signaling worker to stop current job/not begin another.");
this.worker.stop();
while(this.worker.isProcessingJob()) {
Thread.sleep(3 * 1000);
}
log.info("Worker successfully stopped");
log.info("destroy() complete");
super.destroy();
}
在许多情况下,我没有看到最后两个日志,即当我的代码在while-loop
中等待this.worker
完成当前作业时,Tomcat会关闭。
这是预期的行为吗?有没有办法告诉tomcat停止,还允许我的Servlet的destroy()
方法阻止/完成?