参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!
----主线:
----源码:
先在服务端加个断点和修改下代码:如图:
然后启动server和client;然后跳过bossGroup到workerGroup;进入workerGroup的关闭:在此之前呢,先在NioEventLoop里面的关闭处打个断点:
然后跟进来看看closeAll();
这里selectAgain();目的是为了去除canceled的key,接下来的key都是有效的key了。完成之后接着回去
进入到confirmShutdown();
这里会run Task和hook;挨个执行则返回:
----总结:
①关闭服务本质:
关闭所有连接及Selector:
java.nio.channels.Selector#keys
java.nio.channels.spi.AbstractInterruptibleChannel#close
java.nio.channels.SelectionKey#cancel
selector.close();
关闭所有线程:退出循环体for(;;).
②关闭服务要点:
优雅(DEFAULT_ SHUTDOWN_ _QUIET_ PERIOD )
可控(DEFAULT_ SHUTDOWN_ _TIMEOUT)
先不接活,后尽量干完手头的活(先关boss后关worker: 不是100%保证)