@Component
public class AppShutdownHook {
@PostConstruct
public void register() {
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("JVM 关闭时触发:" + Thread.currentThread().getName());
// 需要进行的操作
}, "app-shutdown-hook"));
}
}
上述方式在如下退出场景下有效:
-
main 方法执行完毕退出
-
`System.exit(0)` 主动退出
-
Linux下 `kill -15`
-
Ctrl+C 控制台中断
大坑 kill -9是不会触发的,所以务必用kill -15
附kill信号列表:
| 编号 | 名称 | 含义 |
|---|---|---|
| 1 | HUP | 挂起(很多守护进程用它重载配置) |
| 2 | INT | 中断(相当于 Ctrl+C) |
| 9 | KILL | 强制杀死,进程无法捕获或忽略 |
| 15 | TERM | 终止(默认信号,可被捕获/清理) |
| 18 | CONT | 继续执行 |
| 19 | STOP | 暂停进程(不可捕获) |
| 20 | TSTP | 终端暂停(相当于 Ctrl+Z) |