有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java spring threadpooltaskexecutor导致tomcat内存泄漏

我知道这个问题被问了好几次,但没有一个能提供正确答案,所以重新发布

我有一个在Tomcat7中运行的Spring4Jersey Web服务

我正在使用Spring的ThreadPoolTaskExecutor来处理队列中的一些消息。我有一个bean,它使用@Scheduled,每1000毫秒向执行者提交一次任务

然而,我注意到当我关闭Tomcat时,它警告我它不能关闭某些任务

    SEVERE: The web application appears to have started a thread named [taskExecutor-9] but has failed to stop it. This is very likely to create a memory leak.
 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

这是我用来初始化taskExecutor的代码

@Bean(destroyMethod="shutdown")
 public Executor taskExecutor() {
     return Executors.newScheduledThreadPool(100);
 }

http://docs.spring.io/spring/docs/3.2.0.RC1_to_3.2.0.RC2/changes/docdiffs_org.springframework.scheduling.annotation.html

提到spring会处理我创建的线程;但不幸的是,情况似乎并非如此

有人能提供一些建议吗


共 (1) 个答案

  1. # 1 楼答案

    作为一个web应用程序,您可以尝试以下内容:

    您的计划配置类

    @Configuration
    @EnableScheduling
    public class SchedulerConfig implements SchedulingConfigurer {
    
        /* Beans and Other Stuff */
    
        @Override
        public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
            taskRegistrar.setScheduler(workers());
        }
    
        @Bean(name = "executorService")
        ExecutorService workers() {
            return Executors.newScheduledThreadPool(100);
        }
    
    }
    

    关闭ServletContextListenercontextDestroyed方法中的ExecutorService

    @Configuration
    public class CustomServletContextListener implements ServletContextListener {
    
        @Autowired
        private ExecutorService executorService;
    
        @Override
        public void contextInitialized(ServletContextEvent context) {
            /* Do stuff If Required */
        }
    
        @Override
        public void contextDestroyed(ServletContextEvent context) {
            executorService.shutdown();
        }
    
    }
    

    为我工作,我使用Tomcat8