gpt4 book ai didi

java - 如何使用 Spring 正确关闭执行程序服务?

转载 作者:IT老高 更新时间:2023-10-28 13:47:57 26 4
gpt4 key购买 nike

我有一个命令行应用程序,它使用 Spring 管理的 bean,该 bean 由一个 java ExecutorService 创建:

ExecutorService service = Executors.newFixedThreadPool(4);

现在,我希望我的服务在我的应用程序关闭时关闭,所以我让我的 bean 实现了 DisposableBean 接口(interface)并有一个销毁方法,例如:

public void destroy(){
service.shutdown();
}

然后我可能想做一些事情,比如在 Spring 上下文中注册一个关闭 Hook 。但是我发现(艰难的方式,即在预生产版本中)这不起作用:在调用 ExecutorService.shutdown() 方法之前不会调用关闭 Hook ,导致经典的 catch 22 问题(它确实会在中断时调用,即,如果我在应用程序运行时按 Ctrl-C)。这逃脱了我的单元测试,因为出于某种原因,它似乎在 JUnit 中运行良好,这仍然让我感到困惑:JUnit 有什么不同?

到目前为止,我找到的解决方案是在退出主函数之前显式调用 ApplicationContext.close()。我想知道是否有更好的解决方案,以及由 Spring 管理灵活线程池的最佳实践是什么。另外,如果我的 bean 不是由 Spring 直接管理,而是由 Spring 管理的 bean 创建的,该怎么办?我应该将调用级联到 destroy() 吗?这不是很容易出错吗?

感谢任何意见、建议、进一步阅读、RTFM、神奇食谱。

谢谢!

最佳答案

你知道吗:

ExecutorService service = Executors.newFixedThreadPool(4);

可以用这个代替:

<bean id="service" class="java.util.concurrent.Executors" 
factory-method="newFixedThreadPool" destroy-method="shutdown">
<constructor-arg value="4"/>
</bean>

然后,spring 上下文更直接地管理执行器服务的关闭——并且它可以更容易地重用。

关于java - 如何使用 Spring 正确关闭执行程序服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18516131/

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