2011-08-12 210 views
14

如果在應用程序初始化期間發生異常,是否有任何方法可以阻止Java EE應用程序啓動?基本上我正在尋找一種方法,在應用程序初始化期間,從應用程序的ServletContextListenerSingletonStartup bean中引發未處理的異常,從而使應用程序輸入「j2ee.state.failed」狀態(每JSR-77)。Java EE應用程序啓動失敗

EJB specification似乎表明,如果在初始化一個Singleton bean期間發生異常,應用程序將繼續啓動並且運行時沒有錯誤;但是,只有bean本身可能處於無法調用的狀態。不幸的是,這不是我正在尋找的行爲。

4.8.4辛格爾頓錯誤處理辛格爾頓初始化期間發生

錯誤被認爲是致命的,必須導致Singleton實例的丟棄。可能的初始化錯誤包括注入失敗,從PostConstruct方法拋出的系統異常,或方法容器管理事務成功提交的PostConstruct失敗。如果單例初始化失敗,對Singleton的嘗試調用將導致第3.4.3節和第3.4.4節定義的異常。

Servlet specification是在它的要求更加模糊一點,似乎不要求容器以任何特定方式來運轉,而僅是暗示(通過使用術語「可以」),該幅材模塊繼續啓動,但任何請求都應導致內部服務器錯誤。再次,這不幸的不是我正在尋找的行爲。爲什麼Web應用程序如果無法處理任何請求,會繼續啓動並顯示爲正在運行?

11.6監聽器異常

該容器可以對所有後續請求與HTTP狀態代碼500中的Web應用程序來指示應用程序的錯誤響應。

根據我的經驗,我已經看到了應用服務器不同的方式處理這一要求。一些容器實際上會阻止應用程序在這些情況下啓動,而其他容器只會抑制異常並按照規範中的建議迴應500個錯誤的請求。

我忽略了規範的任何部分,如果在初始化過程中發生異常,會阻止應用程序啓動?

+0

+1;好問題。這也是我的經驗 - 它們的做法有所不同...... – home

回答

0

在web應用程序的情況下 - 爲什麼不創建一個servlet過濾器,它將檢查你自己的「失敗」標誌,並且如果這個標誌被提出,返回500的任何請求?從容器的角度來看,你的應用程序當然會啓動。

+0

目標是阻止應用程序在無效狀態下啓動。 ServletContainerListeners和Singleton啓動Bean通常用於執行應用程序運行所需的初始化;如果在初始化期間發生錯誤,理想狀態將是快速失效。這可以防止用戶檢測到故障,並立即引起管理員的注意。它還將允許與應用程序無關的部署工具全面檢測應用程序啓動失敗並相應地執行操作;例如,通過回滾應用程序更新。 – shelley

2

我認爲這取決於您使用的應用程序服務器。正如你所提到的,他應該如何處理無效狀態的部署。當部署失敗時,它們不會處於活動狀態,因此您必須提供一個服務,以便在成功啓動時查找部署應提供的提示。如果沒有,您可以通知管理員。但是這是所有服務器特定的或需要一個外部工具。

在一些項目中,我們使用[nagios] [1]和[rhq] [2]來檢查部署。例如,nagios會在JBossAS上檢查所需部署的jmx控制檯。當部署的應用程序在部署後幾秒鐘內未顯示時,通知其工作人員。

+0

Tomcat 7.x不會啓動一個從'ServletContextListener.contextInitialized()'拋出未經檢查的異常的應用程序,而WebLogic 12.1.3將啓動該應用程序。 – javabrett

1

+1 to meme answer。也許這可能會有所幫助:在我的expirience組合中,如果具有註釋@Startup和@Singleton的bean在@PostConstruct方法中拋出異常,它將阻止整個應用程序(耳朵)在JBoss AS 7.1.1上啓動

+2

同樣在WebSphere Application Server 8.0+上。 –

相關問題