Netty 中 ChannelHandler执行次序源码分析
2018-02-05 21:04
656 查看
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);
}
相关文章推荐
- Netty 权威指南笔记(七):ChannelPipeline 和 ChannelHandler 源码分析
- Netty学习:ChannelHandler执行顺序详解,附源码分析
- netty源码分析之-Channel、ChannelPipeline、ChannelHandler以及 ChannelHandlerContext 详解(2)
- Netty5源码分析(七) -- 异步执行Future和Promise
- netty源码分析系列——ChannelHandler系列
- springMVC源码分析--访问请求执行ServletInvocableHandlerMethod和InvocableHandlerMethod
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行
- Docker源码分析(二):Docker Client创建与命令执行
- Netty 4 源码分析——结构概览
- netty源码分析系列——Channel
- mybatis源码学习之执行过程分析(4)——映射文件中sql的获取和sql语句的执行
- netty4.0.x源码分析—channel
- netty4.0.x源码分析—bootstrap
- netty源码分析 之四 transport(ChannelPipeline)
- netty源码分析(十三)Netty核心四大组件关系与构建方式深度解读
- netty源码分析(十四)Netty初始化流程总结及Channel与ChannelHandlerContext作用域分析
- Netty源码分析之客户端启动过程
- netty(十三)源码分析之Channel
- hsqldb源码分析系列3 执行引擎分析 插入过程分析