netty 4 pipeline 顺序图解

刚开始写 netty 的时候, 会对 pipeline 很疑惑, 其实并不复杂。

netty 4 pipeline 图解


首先看一下 event 是如何流动的:

netty4 pipeline

不过更好的说明是在 Java Document 中, 推荐阅读一下, 很有帮助: io.netty.channel.ChannelPipeline

How an event flows in a pipeline

The following diagram describes how I/O events are processed by ChannelHandlers in a ChannelPipeline typically. An I/O event is handled by either a ChannelInboundHandler or a ChannelOutboundHandler and be forwarded to its closest handler by calling the event propagation methods defined in ChannelHandlerContext, such as ChannelHandlerContext.fireChannelRead(Object) and ChannelHandlerContext.write(Object).
...

这个图更形象:





I/O Request
via Channel or
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) |
+-------------------------------------------------------------------+

写代码


那么, 在代码中如何体现这种顺序呢 ?

如下所示 :

ChannelPipeline p = ...;
p.addLast("1", new InboundHandlerA());
p.addLast("2", new InboundHandlerB());
p.addLast("3", new OutboundHandlerA());
p.addLast("4", new OutboundHandlerB());
p.addLast("5", new InboundOutboundHandlerX());

当 inbound event 到来时, handler 顺序是 12345, 而 outbound 时, 顺序是 54321.

不过:

  1. 因为3和4没有实现 ChannelInboundHandler , 所以 inbound 事件的顺序是 125
  • 因为1和2没有实现ChannelOutboundHandler, 所以outbound时间是543
  • 因为5实现了 ChannelInboundHandlerChannelOutboundHandler, 所以 inbound 和 outbound event 都会经过.

参考