我已经将ShutDownHook添加到我的Spring Boot应用程序中。当我将SIGTERM传递给我的应用程序时,shutdown钩子被触发,但它在中途终止,即在执行过程中终止。谷歌了它,尝试了很多解决方案,但都不起作用。一些专家,请帮我一下。
ConfigurableApplicationContext applicationContext = new SpringApplicationBuilder(MyApp.class)
.profiles("default")
.registerShutdownHook(false)
.build()
.run(args);
Runtime.getRuntime().addShutdownHook(new Thread(new GracefulShutdownHook(applicationContext)));
GracefulShutdownHook类:
public class GracefulShutdownHook implements Runnable {
private final ConfigurableApplicationContext applicationContext;
public GracefulShutdownHook(ConfigurableApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
public void run() {
try {
log.info("Gonna wait for 5 seconds before shutdown SpringContext!");
Thread.sleep(5 * 1000);
log.info("Spring Application context starting to shutdown");
applicationContext.close();
log.info("Spring Application context is shutdown");
} catch (InterruptedException e) {
log.error("Error while gracefulshutdown Thread.sleep", e);
}
}
}
我想让关机钩子更新一些缓存和一些逻辑,这会消耗一些额外的处理时间。
当我尝试使用“杀戮-15”杀戮时的日志:
Apr 13 10:08:22 ssed java[14354]: 2018-04-13T10:08:22,778 INFO [c.o.GracefulShutdownHook] -- Gonna wait for 10 seconds before shutdown SpringContext!
Apr 12 15:24:51 vm33 systemd[1]: Stopping Session Application Service...
Apr 12 15:24:51 vm33 java[29538]: 2018-04-12T15:24:51,421 INFO [c.o.GracefulShutdownHook] -- Gonna wait for 10 seconds before shutdown SpringContext!
Apr 12 15:25:01 vm33 systemd[1]: Stopped Session Application Service.
您可以添加以下代码在关机时执行操作:
@RestController
@Slf4j
public class GetDataController {
//your code
@PreDestroy
public void onExit() {
log.info("###STOPing controller ##");
try {
Thread.sleep(5 * 1000);
} catch (InterruptedException e) {
log.error("", e);;
}
log.info("###STOP FROM THE LIFECYCLE controller###");
}
}
@RestController
可以是其他类型的,如@Component
、@SpringBootApplication
等等。
我如何注册/添加一个自定义的关闭例程,当我的Spring Boot应用程序关闭时,该例程将被触发? 场景:我将Spring Boot应用程序部署到一个Jetty servlet容器(即,没有嵌入式Jetty)。我的应用程序使用Logback进行日志记录,并且我希望在运行时使用Logback的MBean JMX配置器更改日志记录级别。它的文档说明,为了避免内存泄漏,在关机时必须调用特定的Logger
我阅读了如何以正确的方式关闭一个Spring Boot应用程序?,所以我尝试使用http关闭endpoint来关闭我的Spring Boot嵌入式tomcat应用程序。 有没有办法只挂起关闭endpoint,这样我就可以检查请求者IP了?
我有一个Spring Boot应用程序在负载均衡器后面的两个服务器上运行。 我定义了一个shutdown挂钩,它将应用程序中的/healthcheckendpoint设置为返回404错误,等待30秒以完成所有操作,然后停止JVM。负载均衡器被配置为在看到404错误时将服务器置于维护模式。(这与“down”状态不同--飞行中的连接允许在维护模式下完成)
问: 为什么我关闭了终端,Workerman就自己关闭了? 答: Workerman有两种启动模式,debug调试模式和daemon守护进程模式。 运行 php xxx.php start 是进入debug调试模式,用于开发调试问题,当终端关闭后Workerman会随之关闭。 运行 php xxx.php start -d进入的是daemon守护进程模式,终端关闭不会影响Workerman。 如果
我想关闭Spring Boot应用程序控制台上的调试输出。我希望有一个默认的信息记录。但事实并非如此。我试图用暴力来关闭关卡https://mkyong.com/spring-boot/spring-boot-log4j-2-example/我不喜欢这个,现在它甚至不工作。在如何在spring boot中关闭调试日志消息中,这被标记为解决方案。我想不是。我将我的项目减少到最小,并在多种设置中得到此
问题内容: 我只是不明白为什么必须使用Runtime.addShutdownHook。如果要在jvm退出时进行一些清理,为什么不重载daemon类的finalize方法。使用shutdown钩子而不是finalize方法的好处是什么。 还有一个不赞成使用的函数runFinalizersOnExit。如果将其设置为false,我相信终结器将不会运行。这与java保证终结器始终在垃圾回收之前运行是矛盾