gpt4 book ai didi

java - 停止 Tomcat 时,ExecutorService 不会从 contextDestroyed() 关闭

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:43 26 4
gpt4 key购买 nike

我有一个 ExecutorService executor = Executors.newSingleThreadExecutor(); 我想在服务器关闭时停止。

我有一个 实现 ServletContextListener 的类,它用 @WebListener 注释。

我在那个类中有两个方法:

@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContextListener started");
}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
executor.shutdown();
executor.shutdownNow();
System.out.println("ServletContextListener destroyed");
}

我看到它按预期打印了它们中的内容,但是当我在 intelij 中按一次停止按钮时,我得到:

SEVERE: The web application [] appears to have started a thread named [pool-2-thread-1] but has failed to stop it. This is very likely to create a memory leak.

紧接着它打印出 ServletContextListener destroyed

我需要再次按下停止按钮才能完全停止它。

为什么它不关闭 ExecutorService,即使它到达了 executor.shutdown();?我做错了什么?

PS:这是我唯一的 ExecutorService,我没有创建其他线程。

编辑2:

执行器服务是单例类中的一个字段,它是用类初始化的:

private ExecutorService executor = Executors.newSingleThreadExecutor();

这是初始化类的方式(惰性初始化):

public static RoomsManager getRoomsManager(ServletContext servletContext) {
if (servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME) == null) {
servletContext.setAttribute(MANAGER_GAMES_ATTRIBUTE_NAME, new RoomsManager());
}
return (RoomsManager)servletContext.getAttribute(MANAGER_GAMES_ATTRIBUTE_NAME);
}

并且是这样注释的:

@WebListener
public class RoomsManager implements ServletContextListener {

停止按钮是 intelij IDEA 中播放和调试按钮附近的红色方 block 。

最佳答案

问题是您有两个不同的 RoomsManager 实例(因此,有两个不同的执行程序):第一个是由 Tomcat 创建的,第二个是由您创建的。

当您使用 @WebListener 注释 RoomsManager 时,Tomcat 会自动创建该类的实例并订阅它以接收 servlet 上下文创建/销毁事件。该实例实际上是停止其执行程序并打印 ServletContextListener destroyed 的实例。

第二个实例是您在 getRoomsManager 方法中创建的(顺便说一句,该方法看起来不是线程安全的)。该实例未在 Tomcat 中注册,也未接收到 servlet 上下文“销毁”事件,因此它甚至不会尝试关闭其执行程序。

关于java - 停止 Tomcat 时,ExecutorService 不会从 contextDestroyed() 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236736/

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