当ChannelDuplexHandler写入方法是最后一个处理程序时,应调用它,但实际上并非如此。
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);
}
}
是否有一个特殊的技巧来获取最后一个双工处理程序写入方法?
答案 0 :(得分:4)
感谢Norman的slides,这是因为ctx.write()
或writeAndFlush()
将从下一个处理程序开始,而不是当前处理程序,而ctx.channel().write()
将从pipeline
的顶部(或尾部,如果符合更好的方向感)。