不调用netty channelDuplexHandler写入

时间:2018-06-05 07:35:39

标签: netty

当ChannelDuplexHandler写入方法是最后一个处理程序时,应调用它,但实际上并非如此。

来自ChannelPipeline

 ChannelPipeline p = ...;
 p.addLast("1", new InboundHandlerA());
 p.addLast("5", new InboundOutboundHandlerX());

入站和出站事件的评估顺序可分别为1,5和5。

因此我认为在调用write中的ctx.write()时,应调用以下类中的channelRead

@ChannelHandler.Sharable
@Component
public class InboundOutboundHandlerX extends ChannelDuplexHandler {


    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ctx.write(msg); // I have also tried writeAndFlush(msg)
    }

    @Override
    public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
        ctx.write(msg, promise);  
    }

}

是否有一个特殊的技巧来获取最后一个双工处理程序写入方法?

1 个答案:

答案 0 :(得分:4)

感谢Norman的slides,这是因为ctx.write()writeAndFlush()将从下一个处理程序开始,而不是当前处理程序,而ctx.channel().write()将从pipeline的顶部(或尾部,如果符合更好的方向感)。