前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pipeline.fireChannelActive()管道的遍历激活

pipeline.fireChannelActive()管道的遍历激活

原创
作者头像
spbreak
发布2023-09-29 16:07:25
1810
发布2023-09-29 16:07:25
举报
文章被收录于专栏:nettynetty

一. 管道的编历激活

  • pipeline管道是处理channel与socket之间数据传输的一系列加工流
  • 添加到pipeline中的handler处理器, 代表一个数据加工处理的子步骤
  • 每个handler处理器继承一个channelActive管道激活方法
  • pipeline.fireChannelActive() 管道的启动通道激活方法是遍历所有符合事件掩码的handler.channelActive()方法
管道的编历激活
管道的编历激活

二. 事件掩码

  • MASK事件掩码: 以二进制数值代表一个事件 如: 二进制 1111, 代表4个事件
  • MASK_ONLY_INBOUND : 入站事件掩码集
  • MASK_ONLY_OUTBOUND : 出站事件掩码集
channel的事件掩码
channel的事件掩码
代码语言:javascript
复制
// 通过位运算的方法, 判断此处理器(Context)的事件掩码是否包含在符合的事件掩码集内
private static boolean skipContext(
    AbstractChannelHandlerContext ctx, EventExecutor currentExecutor, int mask, int onlyMask) {
// Ensure we correctly handle MASK_EXCEPTION_CAUGHT which is not included in the MASK_EXCEPTION_CAUGHT
return (ctx.executionMask & (onlyMask | mask)) == 0 ||
        // We can only skip if the EventExecutor is the same as otherwise we need to ensure we offload
        // everything to preserve ordering.
        //
        // See https://github.com/netty/netty/issues/10067
        (ctx.executor() == currentExecutor && (ctx.executionMask & mask) == 0);
}

三. fireChannelActive() 的整体调用流程

  • 通过pipeline的handler处理器链表, 找寻第一个handler
  • 判断第一个handler的MASK事件掩码是否符合此次事件
    • 不符合就继续通过链表找下一个handler
    • 符合调用handler的channelActive()方法
    • 调用后继续通过链表找下一个handler
  • 直到到达尾部TailHandler
fireChannelActive() 的整体调用流程
fireChannelActive() 的整体调用流程

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一. 管道的编历激活
  • 二. 事件掩码
  • 三. fireChannelActive() 的整体调用流程
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档