netty channelDuplexHandler写不被调用

Tii*_*ina 3 netty

当它是最后一个处理程序时,应调用ChannelDuplexHandler write方法,但实际上不是。

ChannelPipeline中

 ChannelPipeline p = ...;
 p.addLast("1", new InboundHandlerA());
 p.addLast("5", new InboundOutboundHandlerX());
Run Code Online (Sandbox Code Playgroud)

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

所以我认为write在in调用时应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);  
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Tii*_*ina 5

感谢Norman的幻灯片,这是因为ctx.write()writeAndFlush()将从下一个处理程序而不是当前处理程序ctx.channel().write()开始,而将从的上一个处理程序(或从尾部开始,如果更适合方向感的话)开始pipeline