为了账号安全,请及时绑定邮箱和手机立即绑定

Tomcat关闭时Spring Boot中Executor服务的关闭

Tomcat关闭时Spring Boot中Executor服务的关闭

30秒到达战场 2022-06-23 16:22:59
我在 Spring Boot 中配置了一个执行器服务,如下所示:@Configuration@PropertySource({ "classpath:executor.properties" })public class ExecutorServiceConfig {    @Value("${"executor.thread.count"}")    private int executorThreadCount;    @Bean("executorThreadPool")    public ThreadPoolExecutor cachedThreadPool() {        return new ThreadPoolExecutor(executorThreadCount, executorThreadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());    }}该应用程序部署在一个独立的 Tomcat 实例上。当Tomcat服务器关闭时,我发现队列中还有未完成的任务。结果,我会丢失数据。有没有办法让我在这个执行程序服务上调用 awaitTermination 以便它有机会完成队列中的内容?谢谢!
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

使用注释进行@PreDestroy注释。然后从那里执行执行服务的关闭。


@Configuration

class ExecutorServiceConfiguration {


    @Value("${"executor.thread.count"}")

    private int executorThreadCount;



     public static class MyExecutorService {

           private ThreadPoolExecutor executor;


           public MyExecutorService(ThreadPoolExecutor executor) {

               this.executor = executor;

           }

           @PreDestroy()

           public destroy() {

                  // destroy executor

           }

     }


    @Bean("executorThreadPool")

    public ThreadPoolExecutor cachedThreadPool() {

        return new ThreadPoolExecutor(executorThreadCount, executorThreadCount, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

    }


    @Bean

    public MyExecutorService configureDestroyableBean(ThreadPoolExecutor cachedThreadPool) 

    {

      return new MyExecutorService(cachedThreadPool);

    }


}


查看完整回答
反对 回复 2022-06-23
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

您可以通过配置TomcatEmbeddedServletContainerFactorybean 来挂钩到 Tomcat 生命周期。它有一个方法 addContextLifecycleListeners 允许您实例化您自己的 LifecycleListener 并根据需要处理任何Tomcat 生命周期事件(例如,通过调用awaitTermination您的ExecutorService)。


@Configuration

public class TomcatConfiguration implements LifecycleListener {


    @Autowire("executorThreadPool")

    private ThreadPoolExecutor executor;


    @Bean

    public EmbeddedServletContainerFactory embeddedTomcatFactory() {

        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();

        factory.addContextLifecycleListeners(this);

        return factory;

    }


    @Override

    public void lifecycleEvent(LifeCycleEvent event) {

        //if check for correct event        

        executor.awaitTermination();

    }

}


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信