ChannelInboundHandlerAdapter 和 SimpleChannelInboundHandler 对msg传递和flush的影响
区别在于:ChannelInboundHandlerAdapter重写channelRead,SimpleChannelInboundHandler重写channelRead0。其中channelRead0为对channelRead的优化。
SimpleChannelInboundHandler中channelRead0对channelRead的优化源码:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
boolean release = true;
try {
if (acceptInboundMessage(msg)) {
@SuppressWarnings("unchecked")
I imsg = (I) msg;
channelRead0(ctx, imsg);
} else {
release = false;
ctx.fireChannelRead(msg);
}
} finally {
if (autoRelease && release) {
ReferenceCountUtil.release(msg);//释放msg
}
}
}
protected abstract void channelRead0(ChannelHandlerContext ctx, I msg) throws Exception;
从上面代码可以看出,channelRead0在调用channelRead对msg处理后,对msg缓存进行了释放。
释放msg,实验如下(先看结论,因为测试了个寂寞):
Server两个Handler,一下三种情况只对ServerHandler1进行调整,ServerHandler2不变动。
情况一(ChannelInboundHandlerAdapter 加手动释放):(手动释放代码如上release)
客户端结果(重点在write和flush的信息输出的区别)
可以发现Handler1:E(write但没lush)和Handler2都没有输出。
情况二(ChannelInboundHandlerAdapter 不手动释放):
客户端结果
可以发现全部输出。
情况三(SimpleChannelInboundHandler 不手动释放):
客户端结果
可以发现全部输出。
结论:1、SimpleChannelInboundHandler释放了个寂寞,没搞懂。。 先记录一下以后发现了再更新。或高人评论一下原因。
2、SimpleChannelInboundHandler并不影响 ctx.fireChannelRead(msg) 的传递。