gpt4 book ai didi

multithreading - 如何正确终止在 tomcat 上运行的 webapp 拥有的本地线程指示关闭

转载 作者:行者123 更新时间:2023-12-04 17:42:26 25 4
gpt4 key购买 nike

后端 Web 应用程序部署在 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<UpdateLog> 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;
    }
    }

    最佳答案

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

    我发现这个问题是因为我想弄清楚为什么我的 web 应用程序没有正确关闭;我的线程在运行 shutdown.* 时不会被杀死。事实上,它停止了一些线程,但最终只是处于某种不确定状态。事实上,我的类(class)几乎和这个一模一样。

    在前台 Tomcat 窗口(在 Windows 上)中键入 Ctrl+C 确实会停止一切,但是使用 Tomcat 附带的 init 脚本不会。不幸的是,我还没有弄清楚为什么......

    编辑:我想通了。我的大多数监视线程都在 ServletContextListener 中启动,但是当该上下文被“破坏”时,子线程没有得到通知。我通过简单地将所有子线程保留在一个 List 中并循环遍历,在 contextDestroyed() 方法中的每个子线程上调用 Thread.interrupt() 来修复它。这几乎与 Eddie 所说的 servlet destroy() 方法相同。

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

    关于multithreading - 如何正确终止在 tomcat 上运行的 webapp 拥有的本地线程指示关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655342/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com