2010-03-08 24 views
6

我的應用程序使用Spring DefaultMessageListenerContainer來處理傳入的消息。該應用程序的主要方法已經註冊了一個關機掛鉤。從bean強制Spring關閉的最佳方法?

問題是:強制應用程序上下文關閉的最佳方式是什麼?

如果我在消息偵聽器中拋出RuntimeException,它由容器處理,而不是傳遞。調用System.exit是否可以接受?我是否將ApplicationContext傳遞給需要關閉的每個班級,因此我可以撥打close()進行關閉?

+1

爲什麼你需要關閉關閉應用程序上下文? – Bozho

+0

因爲消息監聽器可以決定它需要;要麼是因爲它收到了一條要求應用程序關閉的管理消息,或者是因爲發生了異常情況。有很多,其中之一是收到太多重試(這是一個高容量系統) – xcut

回答

13

您可以將您的應用程序上下文轉換爲ConfigurableApplicationContext並在其上調用close()。至少這是在Web應用程序環境中關閉上下文時發生的情況,如果該servlet上下文被銷燬。

如果你想要得到阿霍德的ApplicationContext的,你的bean可以實現ApplicationContextAware

另一種選擇是注入(或@Autowired自動裝配)的應用程序上下文:

@Inject 
private ApplicationContext ctx; 
+0

需要關閉的bean如何獲​​取上下文?這是一個POJO .. – xcut

+0

@xcut它取決於您的應用程序。它是一個Web應用程序,一個桌面應用程序? – Bozho

+0

都不是 - 消息排隊/路由系統。所以我想唯一的方法是將上下文傳遞給bean,或者實現某種額外的生命週期接口? – xcut