2017-02-26 79 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这样的外部服务管理器重新启动。

相关问题