参考文献:极客时间傅健老师的《Netty源码剖析与实战》Talk is cheap.show me the code!
----主线:worker thread
触发pipeline.fireChannelRead(byteBuf)把读取到的数据传播出去
----源码解释:
还和之前一样,在NioEventLoop里面加断点:
然后启动服务端和客户端:效果图:
然后跟进read();由于步骤和之前的源码差不多,所以这次只挑重点:
这个就是业务处理的入口,所以跟进去看看即可:
这个head表示从头开始的,继续跟进去:
这里的next默认的就是NioEventLoop;所以继续跟进:
继续跟进channelRead();
ctx.fireChannelRead(msg);表示继续在pipeline上传递,继续跟进:
继续跟进方法:
接着往下走:
这里就相当于就算运算结果。
----总结:
处理业务的本质:数据在pipeline中所有的handler的channelRead()执行过程
前提:Handler要实现io.netty.channel.ChannelInboundHandler#channelRead(ChannelHandlerContext ctx,Object msg),且不能加注解@Skip
中途可以退出,不保证执行到tail handler
默认处理线程就是Channel绑定的NioEventLoop线程,也可以设置其他;
pipeline.addLast(new UnorderedThreadPoolEventExecutor(10),serverHandler)。