我有一个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进程并重启它,如果它被杀死的话。 –