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

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


← Posts