Channel 与ChannelPipeline
相信大家都已經知道,在Netty 中每個Channel 都有且僅有一個ChannelPipeline 與之對應,它們的組成關系如下:
通過上圖我們可以看到, 一個Channel 包含了一個ChannelPipeline , 而ChannelPipeline 中又維護了一個由ChannelHandlerContext 組成的雙向鏈表。這個鏈表的頭是HeadContext,鏈表的尾是TailContext,并且每個ChannelHandlerContext 中又關聯著一個ChannelHandler。
上面的圖示給了我們一個對ChannelPipeline 的直觀認識,但是實際上Netty 實現的Channel 是否真的是這樣的呢?我們繼續用源碼說話。在前我們已經知道了一個Channel 的初始化的基本過程,下面我們再回顧一下。下面的代碼是AbstractChannel 構造器:
protected AbstractChannel(Channel parent) {this.parent = parent;id = newId();unsafe = newUnsafe();pipeline = newChannelPipeline(); }AbstractChannel 有一個pipeline 字段,在構造器中會初始化它為DefaultChannelPipeline 的實例。這里的代碼就印證了一點:每個Channel 都有一個ChannelPipeline。接著我們跟蹤一下DefaultChannelPipeline 的初始化過程,首先進入到DefaultChannelPipeline 構造器中:
protected DefaultChannelPipeline(Channel channel) {this.channel = ObjectUtil.checkNotNull(channel, "channel");succeededFuture = new SucceededChannelFuture(channel, null);voidPromise = new VoidChannelPromise(channel, true);tail = new TailContext(this);head = new HeadContext(this);head.next = tail;tail.prev = head; }在DefaultChannelPipeline 構造器中, 首先將與之關聯的Channel 保存到字段channel 中。然后實例化兩個ChannelHandlerContext:一個是HeadContext 實例head,另一個是TailContext 實例tail。接著將head 和tail 互相指向, 構成一個雙向鏈表。
特別注意的是:我們在開始的示意圖中head 和tail 并沒有包含ChannelHandler,這是因為HeadContext 和TailContext繼承于AbstractChannelHandlerContext 的同時也實現了ChannelHandler 接口了,因此它們有Context 和Handler的雙重屬性。
?
總結
以上是生活随笔為你收集整理的Channel 与ChannelPipeline的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RPC实现Consumer 远程调用
- 下一篇: 再探ChannelPipeline 的初