前言
Config包里有一个CustomShutdownHook,有什么鸟用呢
在Java程序退出时——尤其是非正常退出时,我们可能需要先执行一些善后工作,如关闭线程池、连接池、文件句柄等,即所谓“优雅停机”(graceful shutdown)。如何保证善后工作的代码能够被执行到呢?Java为用户提供了关闭钩子(shutdown hook),它在以下情景都会被调用:
- 程序正常退出,即最后一个非守护线程结束时;
- 程序中执行到了System.exit()方法;
- 终端接收到了CTRL-C中断,或者注销登录;
- 通过
kill
命令杀死进程(但是kill -9
除外)。
这里我们自己定义了一个关闭钩子
CustomShutdownHook
自定义钩子,主要是两个操作,一个是把所有注册了的服务全关掉
还有一个是把所有的线程池全关了
@Slf4j
public class CustomShutdownHook {
private static final CustomShutdownHook CUSTOM_SHUTDOWN_HOOK = new CustomShutdownHook();
public static CustomShutdownHook getCustomShutdownHook() {
return CUSTOM_SHUTDOWN_HOOK;
}
public void clearAll()
{
log.info("addShutdownHook for clearAll");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
try {
InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), NettyRpcServer.PORT);
CuratorUtils.clearRegistry(CuratorUtils.getZkClient(), inetSocketAddress);
} catch (UnknownHostException ignored) {
}
ThreadPoolFactoryUtil.shutDownAllThreadPool();
}));
}
}
然后怎么用呢
在NettyServer里面写一句
CustomShutdownHook.getCustomShutdownHook().clearAll();//这一行代码清理了之前设置的关闭钩子,确保在服务器关闭时资源能够得到释放。
他就单独启动一个线程了,当服务器关闭的时候执行钩子