我有一個使用多數民衆贊成由具有創建一個Java ExecutorService
的Spring管理bean的一個命令行應用程序:如何用Spring正確關閉執行程序服務?
ExecutorService service = Executors.newFixedThreadPool(4);
現在,我希望我的服務關閉時,我的應用程序關閉,所以我做了我的豆實現DisposableBean
接口,並有破壞的方法,如:
public void destroy(){
service.shutdown();
}
然後,我可能會嘗試做一些像登記在Spring上下文關閉掛鉤。然而,我發現(難道,即在預生產版本中),這不起作用:在調用ExecutorService.shutdown()
方法之前,關閉掛鉤不會被調用,導致經典的catch 22問題(它會得到呼籲中斷,即如果我在應用程序運行時按Ctrl-C)。這讓我的單元測試失敗了,因爲出於某種原因,它似乎在JUnit中運行良好,這仍然令我困惑:JUnit做了什麼不同?
到目前爲止,我發現的解決方案是在我退出主函數之前明確地調用ApplicationContext.close()
。我想知道是否有更好的解決方案,以及由Spring管理靈活的線程池有哪些最佳實踐。另外,如果我的bean是由Spring直接管理的而不是,但是由Spring管理的bean創建?我應該將呼叫級聯到destroy()
嗎?這不會很容易出錯嗎?
我很欣賞任何意見,建議,進一步閱讀,RTFMs,魔術食譜。
謝謝!
PS:如果我想將命令行應用程序移動到諸如Tomcat之類的應用程序服務器,該怎麼辦?有什麼改變嗎? –
包括標題和您的PS我計*七*(7!)問號。 :-)如果你只問一個具體問題,可能會得到更好的答覆。 – Keith