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源码分析