Netty源码-4-ChannelPipeline
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| * <pre> * I/O Request * via {@link Channel} or * {@link ChannelHandlerContext} * | * +---------------------------------------------------+---------------+ * | ChannelPipeline | | * | \|/ | * | +---------------------+ +-----------+----------+ | * | | Inbound Handler N | | Outbound Handler 1 | | * | +----------+----------+ +-----------+----------+ | * | /|\ | | * | | \|/ | * | +----------+----------+ +-----------+----------+ | * | | Inbound Handler N-1 | | Outbound Handler 2 | | * | +----------+----------+ +-----------+----------+ | * | /|\ . | * | . . | * | ChannelHandlerContext.fireIN_EVT() ChannelHandlerContext.OUT_EVT()| * | [ method call] [method call] | * | . . | * | . \|/ | * | +----------+----------+ +-----------+----------+ | * | | Inbound Handler 2 | | Outbound Handler M-1 | | * | +----------+----------+ +-----------+----------+ | * | /|\ | | * | | \|/ | * | +----------+----------+ +-----------+----------+ | * | | Inbound Handler 1 | | Outbound Handler M | | * | +----------+----------+ +-----------+----------+ | * | /|\ | | * +---------------+-----------------------------------+---------------+ * | \|/ * +---------------+-----------------------------------+---------------+ * | | | | * | [ Socket.read() ] [ Socket.write() ] | * | | * | Netty Internal I/O Threads (Transport Implementation) | * +-------------------------------------------------------------------+ * </pre>
|
这里先帖一段ChannelPipeline.java的注释。
其实pipeline比起三篇博客中介绍的类要简单很多,简单总结如下:
一个Channel对应一个pipeline。
一个Channel对应一个EventLoop。
一个Pipeline中有一个双向链表,链表中保存着两种PipelineHandler:Inbound和Outbound。
入站事件(比如read)会触发所有的InboundHandler中的逻辑,方向从head->tail。
出站事件(比如write)会触发OutboundHandler中的逻辑,方向从tail->head。
PipelineHandler并不是直接存在Pipeline中,而是使用了ChannelHandlerContext包装了一下,链表由ChannelHandlerContext构成。
结合这些理解,上图中注释就很容易理解了。
具体内容不分析了,比较简单。
Netty源码分析(三)—数据管道ChannelPipeline源码分析