前言 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();//这一行代码清理了之前设置的关闭钩子,确保在服务器关闭时资源能够得到释放。
他就单独启动一个线程了,当服务器关闭的时候执行钩子