导读
- 语言:java
- OS:Mac OS/Linux/Windows
- 解决的问题:kill -X(-9除外,一般是-2或者-15等)时,让应用安全退出
实例代码
public class ShutdownTest {
public static void main(String[] args) {
System.out.println("Shutdown Test");
Signal sg = new Signal("TERM");
// 监听信号量
Signal.handle(sg, signal -> {
System.out.println("signal handle: " + signal.getName());
System.exit(0);
});
// 注册关闭钩子
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
// 在关闭钩子中执行收尾工作
// 注意事项:
// 1.在这里执行的动作不能耗时太久
// 2.不能在这里再执行注册,移除关闭钩子的操作
// 3 不能在这里调用System.exit()
System.out.println("do shutdown hook");
}));
mockWork();
System.out.println("Done.");
System.exit(0);
}
// 模拟进程正在运行
private static void mockWork() {
//mockRuntimeException();
//mockOOM();
try {
Thread.sleep(120 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 模拟在应用中抛出RuntimeException时会调用注册钩子
private static void mockRuntimeException() {
throw new RuntimeException("This is a mock runtime ex");
}
// 模拟应用运行出现OOM时会调用注册钩子
// -Xms10m -Xmx10m
private static void mockOOM() {
List list = new ArrayList();
for (int i = 0; i < 1000000; i++) {
list.add(new Object());
}
}
}
- 控制台输出
Shutdown Test
- 命令行查看pid
MacBook-Pro:**********$ jps
19641 ShutdownTest(关闭这个)
19092 Launcher
19094 Jps
MacBook-Pro:**********$kill -2 19641
- 关闭系统后控制台输出
signal handle: TERM
do shutdown hook
Process finished with exit code 0
spring 优雅停机
- 版本:spring4.x
- 原理:注册钩子函数
org.springframework.context.support.AbstractApplicationContext#registerShutdownHook
- 实现DisposableBean接口并重写destroy方法,或者用@PreDestroy加在方法上面,用于销毁资源。
- 参考:
Tomcat优雅关闭之路
spring注解之@PreDestroy的实现原理
springboot优雅停机
tomcat优雅停机
相关文章
springboot 2.x 如何优雅的停止服务
Tomcat优雅关闭之路
Spring优雅停止服务的实现及原理分析
Spring Boot 2.3 新特性优雅停机详解
实现SpringBoot应用的优雅关机