我有一個Spring啓動應用程序,它運行在ec2服務器上。 但是,我不希望發生任何嚴重錯誤,我希望從總停止中獲取應用程序。例如,如果OutOfMemory被拋出,JVM停止,我不知道它。Spring引導通知/重啓後發生嚴重錯誤
有沒有辦法以這種方式配置應用程序/服務器,如果發生任何嚴重錯誤,它會自動重新啓動? 在此先感謝。
我有一個Spring啓動應用程序,它運行在ec2服務器上。 但是,我不希望發生任何嚴重錯誤,我希望從總停止中獲取應用程序。例如,如果OutOfMemory被拋出,JVM停止,我不知道它。Spring引導通知/重啓後發生嚴重錯誤
有沒有辦法以這種方式配置應用程序/服務器,如果發生任何嚴重錯誤,它會自動重新啓動? 在此先感謝。
您可以添加幾個依賴你的應用:
RestartEndpoint
,您可以將autowire
放入您的應用程序中,並公開API端點以重新啓動應用程序。完成後,您可以使用任何HTTP監視工具(如Spring Admin)監視應用程序並在需要時重新啓動。
你可以這樣做:
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這樣的外部服務管理器重新啓動。
可以選擇在OutOfMemory異常時退出JVM:http://stackoverflow.com/a/3878199/1179948。然後你可以配置AWS來監視你的JVM進程並重啓它,如果它被殺死的話。 –