2016-07-24 69 views
1

我有一個Spring Web應用程序。當應用程序上下文開始時,我使用ApplicationListener<ContextRefreshedEvent>來執行一些應用程序初始化,特別是我從Web服務加載數據。如果這個Web服務無法訪問,那麼我的應用程序就無法做任何有用的事情,並且保持它的運行是沒有意義的。有沒有辦法以編程方式關閉應用程序上下文?Spring Web應用程序:初始化失敗時關機

我試圖做到以下幾點:

if (contextRefreshedEvent instanceof ConfigurableApplicationContext) 
{ 
    ConfigurableApplicationContext configurableApplicationContext 
      = (ConfigurableApplicationContext) contextRefreshedEvent; 
    configurableApplicationContext.close(); 
} 

但而不是正常關閉,產生了以下異常:

java.lang.IllegalStateException:Bean工廠未初始化或已關閉 - 稱之爲「刷新'在通過ApplicationContext訪問bean之前

那麼在這種情況下關閉應用程序的正確方法是什麼?

+0

你可以設置一些預定的操作來檢查服務是否啓動,並等待它。但在啓動時關閉異常應用程序是可以的。或者,你可以只是捕獲異常並運行system.exit(0)並記錄日誌原因,如果它列在某些異常列表中或異常排除異常中 – Sarief

+0

調用'System.exit'是一個非常糟糕的主意,就好像yu不幸也可能殺死你的服務器,這幾乎不是你想要的。只需拋出一個基本上阻止應用程序啓動的異常。 –

+0

我知道使用'System.exit'的選項,但是我同意@ M.Deinum說這不是一個好主意。有沒有乾淨的方法來避免拋出異常? – lanoxx

回答

0

拋出一個ApplicationContextException。它適用於Spring 4.2.7.RELEASE