va优雅退出实现:
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...");
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
application out...
ShutdownHook execute...
ShutdownHook execute end..
1
2
3
4
注意:
ShutdownHook 在JVM Crash、无法接收信号量、kill -9 时并不会被执行;
ShutdownHook 有多个时,执行顺序不保证;
在JVM关闭期间不能动态添加或删除ShutdownHook;
不要在ShutdownHook 中调用System.exit(),会卡住JVM导致进程无法退出。
Netty需要优雅退出的原因:
尽快释放NIO线程和句柄等资源;
需要将积压在发送队列中的待发消息发送完;
正在读或写的消息,需要继续处理;
设置在NioEventLoop线程调度器中的定时任务,需要执行或清理;
Netty优雅退出的三大类操作:
把NIO线程的状态设置为ST_SHUTTING_DOWN,不再处理新的消息;
把发送队列中的消息尽量发送完(不保证全部)、定时任务、用户注册到NIO线程的退出Hook执行完;
资源释放操作:所有Channel的释放、多路复用器的去注册和关闭、所有队列和定时任务的清空取消,最后是EventLoop线程的退出。
误区:
Netty无法保证所有消息队列的消息能处理完,原因:
待发送消息:调用优雅退出方法之后,不会立即关闭链路;
需要发送的消息:在Netty优雅退出执行期间,应用线程仍然有可能继续调用Channel发送消息,这些消息将发送失败;
3.其他Task等无法保证完全执行,看速度。
————————————————
版权声明:本文为CSDN博主「m0_37039331」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37039331/article/details/84886003