如何使用Spring正确关闭执行器服务?
我有一个命令行应用程序,它使用Spring管理的Bean,它由以下java创建:ExecutorService
ExecutorService service = Executors.newFixedThreadPool(4);
现在,我希望我的服务在我的应用程序关闭时关闭,所以我让我的bean实现接口,并有一个销毁方法,例如:DisposableBean
public void destroy(){
service.shutdown();
}
然后,我可能会想做一些事情,比如在Spring上下文中注册一个关闭钩子。然而,我发现(困难的方式,即在预生产版本中)这不起作用:在调用方法之前不会调用关闭钩子,从而导致经典的 catch 22 问题(它确实在中断时被调用,即,如果我在应用程序运行时按 Ctrl-C)。这逃脱了我的单元测试,因为出于某种原因,它似乎在JUnit内部工作正常,这仍然让我感到困惑:JUnit做了什么不同的事情?ExecutorService.shutdown()
到目前为止,我发现的解决方案是在退出main函数之前显式调用。我想知道是否有更好的解决方案,以及由Spring管理灵活线程池的最佳实践是什么。另外,如果我的豆子不是由Spring直接管理的,而是由Spring管理的豆子创建的,该怎么办?我应该将调用级联到吗?这难道不是很容易出错吗?ApplicationContext.close()
destroy()
我感谢任何评论,建议,进一步阅读,RTFM,魔术食谱。
谢谢!