Channel的writeAndFlush方法(位于AbstractChannel类)代码如下:
它会调用hannelPipeline的writeAndFlush方法,该方法(位于DefaultChannelPipeline类)代码如下:
从上图可以看出,它是从ChannelPipeline的尾部来开始调用writeAndFlush方法的,所以消息会流经所有的ChannelOutboundHandler.
上面的tail是DefaultChannelPipeline里定义的成员变量,表示整个ChannelHandlerContext链表的尾部。
########################################################
而ChannelHandlerContext的代码如下(位于AbstractChannelHandlerContext类)
其中调用的重载方法代码如下:
其中调用的write方法代码如下:
其中会调用findContextOutbound来寻找下一个要处理消息的ChannelOutboundHandler.
findContextOutbound代码如下:
可以看到下一个将要处理的将是在ChannelPipeline中当前ChannelHandlerContext之前的那个ChannelOutboundHandler.
#######################################
结论:
调用channel的writeAndFlush,消息会被所有的ChannalOutboundHandler处理,而调用channelHandlerContext的writeAndFlush方法,消息只会被当前handler上游的ChannelOutboundHandler处理