再看rpc之关闭钩子


前言

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();//这一行代码清理了之前设置的关闭钩子,确保在服务器关闭时资源能够得到释放。

他就单独启动一个线程了,当服务器关闭的时候执行钩子


  目录