Java tomcatservlet';s destroy()在';服务tomcat7站';

Java tomcatservlet';s destroy()在';服务tomcat7站';,java,multithreading,tomcat,servlets,Java,Multithreading,Tomcat,Servlets,我有一个Servlet应用程序,它在init()方法中生成工作线程。这些员工持续从事事务性工作,也就是说,重要的是,每项工作如果开始,就必须完成,否则就不能开始 我希望我可以使用destroy()方法以优雅的方式停止这些工作线程,即在结束destroy()方法和终止Servlet之前,确保它们完成了最后/当前的任何作业 厨师脚本执行服务tomcat7 stop时触发destroy() 但是从我的日志/测试来看,Servlet上的destroy()方法没有阻塞/完成。它被触发了,但过了一会儿,to

我有一个Servlet应用程序,它在
init()方法中生成工作线程。这些员工持续从事事务性工作,也就是说,重要的是,每项工作如果开始,就必须完成,否则就不能开始

我希望我可以使用
destroy()
方法以优雅的方式停止这些工作线程,即在结束
destroy()
方法和终止Servlet之前,确保它们完成了最后/当前的任何作业

厨师脚本执行服务tomcat7 stop时触发
destroy()

但是从我的日志/测试来看,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();
}
在许多情况下,我看不到最后两个日志,即当我的代码处于
循环时,Tomcat会停止运行,而
等待
这个.worker
完成它的当前作业


这是预期的行为吗?是否有某种方法可以告诉tomcat停止,但也允许我的Servlet的
destroy()
方法阻止/完成?

如果您在Eclipse中使用tomcat,请确保服务器超时配置了正确的值您使用的是什么日志框架?您确定您的日志框架没有缓冲日志语句,并且完全关闭了吗?事实上,Servlet spec 3.1在这方面(容器的关闭行为)相当薄弱。您的两个最佳选择:A--联系Tomcat开发人员(例如,通过邮件列表)和B--使您的事务以日志为基础,因此,如果出现故障,您将随后获得一致的状态。@VictorOrokin这是使用Log4j。我不认为缓冲在我的应用程序中曾经是一个问题。我可以确认
服务tomcat7 stop
不允许
destroy()
完成(在生产环境中的Ubuntu 14.04上)@mmcra您的答案有点误导:)