当前位置:  开发笔记 > 运维 > 正文

如何正确杀死在tomcat上运行的webapp拥有的本地线程,指示关闭

如何解决《如何正确杀死在tomcat上运行的webapp拥有的本地线程,指示关闭》经验,为你挑选了1个好方法。

后端webapp部署在Tomcat 6 servlet容器上.在webapp中,启动了几个监视线程.问题在于关机.

我如何知道要求关闭webapp?

我应该如何在我的线程中处理这个问题?

目前我的线程实现如下.当servlet被指示关闭(shutdown.sh)时,它确实完成了一个干净的关闭并且因为这个线程而没有挂起 - 为什么?

class Updater extends Thread {
  volatile boolean interrupted = false;

  @Override
  public void run() {
    Integer lastUpdateLogId = CommonBeanFactory.getXXX()
                              .getLastUpdateLogRecordKey(MLConstants.SMART_DB_NAME);

    List updateLogRecords;
    while (!interrupted) {
      boolean isConfigurationUpdateRequested = false;

      try {
        TimeUnit.SECONDS.sleep(5);
      } catch (InterruptedException e) {
        setInterrupted(true);
      }

      updateLogRecords = CommonBeanFactory.getXXX()
                         .getLastFactsUpdateLogRecords(MLConstants.XXXX, lastUpdateLogId);

      for(UpdateLog updateLog : updateLogRecords) {
        if (updateLog.getTable_name().equals(MLConstants.CONFIG_RELOAD)) {
          isConfigurationUpdateRequested = true;
        }

        lastUpdateLogId = updateLog.getObjectKey();
      }

      if (isConfigurationUpdateRequested) {
        Configuration.getInstance().loadConfiguration();
      }
    }
  }

  public boolean getInterrupted() {
    return interrupted;
  }

  public void setInterrupted(boolean interrupted) {
    this.interrupted = interrupted;
  }
}

Josh.. 6

我想我还不能回复答案.艾迪的回答并不完全正确.

我发现了这个问题,因为我试图找出为什么我的webapp没有正常关闭; 当我运行shutdown时,我的线程不会被杀死.*.事实上,它会阻止一些线程,但最终只是处于某种状态.实际上,我的课几乎就是这个.

在前台Tomcat窗口(在Windows上)键入Ctrl + C会停止所有操作,但是使用Tomcat附带的init脚本则不会.不幸的是,我还没弄明白为什么......

编辑:我想通了.我的大多数监视线程都是在ServletContextListener中启动的,但是当该上下文被"销毁"时,子线程不会被通知.我通过简单地将所有子线程保留在List中并循环遍历,在contextDestroyed()方法中的每个上调用Thread.interrupt()来修复它.它与Eddie关于servlet destroy()方法的内容几乎相同.

但是,当你运行shutdown时,JVM会被立即关闭是不正确的.{sh | bat}.它更像是脚本向Tomcat组件发送关闭请求.您可以接收这些关闭消息并将它们传递给您自己的对象.



1> Josh..:

我想我还不能回复答案.艾迪的回答并不完全正确.

我发现了这个问题,因为我试图找出为什么我的webapp没有正常关闭; 当我运行shutdown时,我的线程不会被杀死.*.事实上,它会阻止一些线程,但最终只是处于某种状态.实际上,我的课几乎就是这个.

在前台Tomcat窗口(在Windows上)键入Ctrl + C会停止所有操作,但是使用Tomcat附带的init脚本则不会.不幸的是,我还没弄明白为什么......

编辑:我想通了.我的大多数监视线程都是在ServletContextListener中启动的,但是当该上下文被"销毁"时,子线程不会被通知.我通过简单地将所有子线程保留在List中并循环遍历,在contextDestroyed()方法中的每个上调用Thread.interrupt()来修复它.它与Eddie关于servlet destroy()方法的内容几乎相同.

但是,当你运行shutdown时,JVM会被立即关闭是不正确的.{sh | bat}.它更像是脚本向Tomcat组件发送关闭请求.您可以接收这些关闭消息并将它们传递给您自己的对象.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有