2017-02-26 44 views
0

我有一個Spring啓動應用程序,它運行在ec2服務器上。 但是,我不希望發生任何嚴重錯誤,我希望從總停止中獲取應用程序。例如,如果OutOfMemory被拋出,JVM停止,我不知道它。Spring引導通知/重啓後發生嚴重錯誤

有沒有辦法以這種方式配置應用程序/服務器,如果發生任何嚴重錯誤,它會自動重新啓動? 在此先感謝。

+0

可以選擇在OutOfMemory異常時退出JVM:http://stackoverflow.com/a/3878199/1179948。然後你可以配置AWS來監視你的JVM進程並重啓它,如果它被殺死的話。 –

回答

0

您可以添加幾個依賴你的應用:

  • 彈簧引導起動器:這暴露了很多endpoints檢查應用程序的狀態,日誌,得到線程轉儲等。
  • spring-cloud-context:這包含RestartEndpoint,您可以將autowire放入您的應用程序中,並公開API端點以重新啓動應用程序。

完成後,您可以使用任何HTTP監視工具(如Spring Admin)監視應用程序並在需要時重新啓動。

0

你可以這樣做:

public static void main(String... args) throws Exception { 
    while(true){ 
     try(ConfigurableApplicationContext ctx = SpringApplication.run(Application.class, args)) { 
      CompletableFuture<Throwable> throwableFuture = new CompletableFuture<>(); 
      Thread.setDefaultUncaughtExceptionHandler(
        (thread, throwable) -> throwableFuture.completeExceptionally(throwable)); 
      throwableFuture.get(); 
     } catch (Exception | VirtualMachineError t) { 
      //log error 
     } 
    } 
} 

這將等待任何線程拋出未捕獲的異常。
try-with-resources語句將關閉上下文並清除與其關聯的所有資源。
while循環將重新創建上下文。

您需要確保創建的任何資源(如線程工廠)以及上下文關閉時正確處理的資源,否則您仍然會耗盡內存。

更好的方法是讓你的java服務由像systemd這樣的外部服務管理器重新啓動。

相關問題