JVM级别捕获退出信号,并在退出时执行处理代码
JVM提供了信号处理接口SignalHandler
来处理进程接收到的信号,比如Ctrl+C
和kill
命令
实现一个信号处理接口
@Slf4j
public class ShutDownSignalHandler implements SignalHandler {
// 旧的处理方法
private SignalHandler oldHandler;
// 注册信号给当前处理器
public SignalHandler install(String signalName) {
Signal diagSignal = new Signal(signalName);
ShutDownSignalHandler instance = new ShutDownSignalHandler();
instance.oldHandler = Signal.handle(diagSignal, instance);
return instance;
}
public void install() {
install("TERM"); // Ctrl+C
install("INT"); // kill命令
}
@Override
public void handle(Signal sig) {
try{
// 处理逻辑,可以根据Signal来判断信号类型
} finally {
// 执行这个就退出了
oldHandler.handle(sig);
}
}
public static void main(String[] args) {
install();
}
}
当我们需要在应用退出时执行一些代码就可以写在handle方法的try里面;由于是JVM级别拦截,该方法适用于任意java程序,不限于spring boot、spring cloud。