Netty优雅退出

Java优雅退出实现:

 public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(()->{
            System.out.println("ShutdownHook execute...");
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("ShutdownHook execute end..");
        }));
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("application out...");
    }
application out...
ShutdownHook execute...
ShutdownHook execute end..

注意:

  1. ShutdownHook 在JVM Crash、无法接收信号量、kill -9 时并不会被执行;
  2. ShutdownHook 有多个时,执行顺序不保证;
  3. 在JVM关闭期间不能动态添加或删除ShutdownHook;
  4. 不要在ShutdownHook 中调用System.exit(),会卡住JVM导致进程无法退出。

Netty需要优雅退出的原因:

  1. 尽快释放NIO线程和句柄等资源;
  2. 需要将积压在发送队列中的待发消息发送完;
  3. 正在读或写的消息,需要继续处理;
  4. 设置在NioEventLoop线程调度器中的定时任务,需要执行或清理;

Netty优雅退出的三大类操作:

  1. 把NIO线程的状态设置为ST_SHUTTING_DOWN,不再处理新的消息;
  2. 把发送队列中的消息尽量发送完(不保证全部)、定时任务、用户注册到NIO线程的退出Hook执行完;
  3. 资源释放操作:所有Channel的释放、多路复用器的去注册和关闭、所有队列和定时任务的清空取消,最后是EventLoop线程的退出。

误区:
Netty无法保证所有消息队列的消息能处理完,原因:

  1. 待发送消息:调用优雅退出方法之后,不会立即关闭链路;
  2. 需要发送的消息:在Netty优雅退出执行期间,应用线程仍然有可能继续调用Channel发送消息,这些消息将发送失败;
    3.其他Task等无法保证完全执行,看速度。

猜你喜欢

转载自blog.csdn.net/m0_37039331/article/details/84886003