Netty 中 ChannelHandler执行次序源码分析


 private AbstractChannelHandlerContext findContextInbound() {
        AbstractChannelHandlerContext ctx = this;
        do {
            ctx = ctx.next;
        } while (!ctx.inbound);
        return ctx;
    }

    private AbstractChannelHandlerContext findContextOutbound() {
        AbstractChannelHandlerContext ctx = this;
        do {
            ctx = ctx.prev;
        } while (!ctx.outbound);
        return ctx;
    } 

    以上代码摘自 AbstractChannelHandlerContext,无论是InboundHandler还是OutboundHandler都是按次序包含在各自的context中。当有进站消息时,第一个handler调用fireChannelRead传递给下一个Handler时。会调用findContextInbound找到下一个类型为inboud的context,自然找到了下一个ChannelHandler。

      这里要注意的是在某一个Inbound handler里面调用write时,netty会调用findContextOutbound找到这个Inbound handler的 prev(前面一个)Handler。所以在这个调用write的Inbound handler之后的outbound handler就不会被调用。

      所以只要记住,所有Inbound和Outbound handler都是按次序在一个pipeline中的,犹如男女拍成一列。当有进站消息时,从这一列的开头寻找Inbound handler依次调用。出站消息时,请注意,如果是某个Inbound handler的发起的,那么只会调用这个Inbound handler前面的Outbound handler。

      如果想让所有Outbound handler处理消息,那么可以调用 pipeline中的write函数。如下函数是在DefaultChannelPipeline中的,tail的类型为Context,也就是说从队列的最尾部的Outbound handler开始遍历。

    @Override
    public final ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) {
        return tail.writeAndFlush(msg, promise);
    }



  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值