国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Netty 框架總結「ChannelHandler 及 EventLoop」

VioletJack / 1916人閱讀

摘要:隨著狀態發生變化,相應的產生。這些被轉發到中的來采取相應的操作。當收到數據或相關的狀態改變時,這些方法被調用,這些方法和的生命周期密切相關。主要由一系列組成的。采用的線程模型,在同一個線程的中處理所有發生的事。

「博客搬家」  原地址: 簡書  原發表時間: 2017-05-05

學習了一段時間的 Netty,將重點與學習心得總結如下,本文主要總結ChannelHandler 及 EventLoop 的知識點和基本用法,本文章節排序參照《Netty in Action》的章節排序。

以下內容主要參考「并發編程網」的 《Netty in Action》中文版 以及《Netty in Action》原版圖書,輔助參考 Essential Netty in Action 《Netty 實戰(精髓)》 以及 Netty 官網的 Netty 4.1 JavaDoc 。
6. ChannelHandler 和 ChannelPipeline

一個 Channel 正常的生命周期如下圖所示。隨著狀態發生變化,相應的 event 產生。這些 event 被轉發到 ChannelPipeline 中的 ChannelHandler 來采取相應的操作。

6.1 ChannelHandler

ChannelHandler 有兩個重要的子接口:

「ChannelInboundHandler」處理輸入數據和所有類型的狀態變化

「ChannelOutboundHandler」處理輸出數據,可以攔截所有操作

6.1.1 ChannelInboundHandler

下表列出接口 ChannelInboundHandler 的方法。當收到數據或相關 Channel 的狀態改變時,這些方法被調用,這些方法和Channel的生命周期密切相關

方法 描述
channelRegistered 當一個Channel注冊到EventLoop上,可以處理I/O時被調用
channelUnregistered 當一個Channel從它的EventLoop上解除注冊,不再處理I/O時被調用
channelActive 當Channel變成活躍狀態時被調用;Channel是連接/綁定、就緒的
channelInactive 當Channel離開活躍狀態,不再連接到某個遠端時被調用
channelReadComplete 當Channel上的某個讀操作完成時被調用
channelRead 當從Channel中讀數據時被調用
6.1.2 ChannelOutboundHandler

輸出的操作和數據由 ChannelOutBoundHandler 處理。它的方法可以被 Channel,ChannelPipeline 和 ChannelHandlerContext 調用,子接口 ChannelOutboundHandler 的主要方法如下:

方法 描述
bind(ChannelHandlerContext,SocketAddress,ChannelPromise) 請求綁定 Channel 到一個本地地址
connect(ChannelHandlerContext, SocketAddress,SocketAddress,ChannelPromise) 請求連接 Channel 到遠端
disconnect(ChannelHandlerContext, ChannelPromise) 請求從遠端斷開 Channel
close(ChannelHandlerContext,ChannelPromise) 請求關閉 Channel
deregister(ChannelHandlerContext, ChannelPromise) 請求 Channel 從它的 EventLoop 上解除注冊
read(ChannelHandlerContext) 請求從 Channel 中讀更多的數據
flush(ChannelHandlerContext) 請求通過 Channel 刷隊列數據到遠端
write(ChannelHandlerContext,Object, ChannelPromise) 請求通過 Channel 寫數據到遠端
6.1.3 ChannelHandler 適配器類

ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter 這兩個適配器類分別提供了 ChannelInboundHandler 和 ChannelOutboundHandler 的基本實現,它們繼承了共同的父接口 ChannelHandler 的方法,擴展了抽象類 ChannelHandlerAdapter。

ChannelHandlerAdapter 提供了工具方法 isSharable()。如果類實現帶 @Sharable 注解,那么這個方法就會返回 true,意味著這個對象可以被添加到多個 ChannelPipeline 中。

ChannelInboundHandlerAdapter 和 ChannelOutboundHandlerAdapter 中的方法調用相關 ChannelHandlerContext 中的等效方法,因此將事件轉發到管道中的下一個ChannelHandler。

6.1.4 ChannelFuture 和 ChannelPromise

ChannelPromise 是 ChannelFuture 的子接口

而 ChannelFuture 是不可變對象

ChannelPromise 定義了可寫的方法,比如 setSuccess(), setFailure()

6.1.5 釋放資源

1. 輸入方向「Inbound」
當一個 ChannelInboundHandler 實現類重寫 channelRead() 方法時,它要負責釋放 ByteBuf 相關的內存。可使用 Netty 提供的工具方法:

    ReferenceCountUtil.release(「ByteBuf 的對象」)

更簡單的,可使用子類 SimpleChannelInboundHandler ,一條消息在被 ChannelRead0() 讀取后,會被自動釋放資源,此時任何對消息的引用都會變成無效,所以不能保存這些引用待后來使用。

2. 輸出方向「Outbound」
在輸出方向,如果處理一個 write() 操作并且丟棄一條消息(沒有寫入 Channel),就應該負責釋放這條消息。

@ChannelHandler.Sharable public 
class DiscardOutboundHandler extends ChannelOutboundHandlerAdapter {

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
    ReferenceCountUtil.release(msg);  //使用 ReferenceCountUtil.release(...) 釋放資源
    promise.setSuccess();  //通知 ChannelPromise 數據已經被處理
}

如果一個消息被“消費”或者丟棄,沒有送到 ChannelPipeline 中的下一個 ChannelOutboundHandler,用戶就要負責調用 ReferenceCountUtil.release()。如果消息到達了真正的傳輸層,在它被寫到 Socket 中或者 Channel 關閉時,會被自動釋放,用戶不用管。

6.2 ChannelPipeline 接口

每個新創建的 Channel 都會分配一個新的 ChannelPipeline,Channel 不可以更換或解除當前的 ChannelPipeline,在 Netty 組件的整個生命周期中這個關系是固定的。

一個 ChannelPipeline 可看成是一串 ChannelHandler 實例,攔截穿過 Channel 的輸入輸出 event。

根據來源,一個 event 可以被一個 ChannelInboundHandler 或 ChannelOutboundHandler 處理。接下來,通過調用 ChannelHandlerContext 的方法,event 會被轉發到下一個同類型的 handler。

6.2.1 ChannelHandlerContext

通過 ChannelHandlerContext,一個 handler 可以通知 ChannelPipeline 中的下一個ChannelHandler,甚至動態改動下一個ChannelHandler 所屬的 ChannelPipeline。

ChannelPipeline 主要由一系列 ChannelHandler 組成的。ChannelPipeline 提供在 ChannelPipeline 中傳送 event 的方法。

ChannelHandlerContext 的一些方法和其他類(Channel 和 ChannelPipeline)的方法名字相似,但是 ChannelHandlerContext 的方法采用了更短的 event 傳遞路程。我們應該盡可能利用這一點來實現最好的性能。

如果你在 Channel 或者 ChannelPipeline 實例上調用這些方法,它們的調用會穿過整個 pipeline。而在 ChannelHandlerContext 上調用的同樣的方法,僅僅從當前 ChannelHandler 開始,走到 pipeline 中下一個可以處理這個 event 的 ChannelHandler。

「本節參考」 第六章 ChannelHandler 和 ChannelPipeline

7. EventLoop 和 EventLoopGroup 7.1 Java 基本的線程池模式

從池中空閑的線程中選出一個,分配一個提交的task「一個Runnable的實現」

當task完成,線程返回池中,等待復用「下一次task分配」

7.2 EventLoop「事件循環」

EventLoop 始終由一個線程驅動

一個 EventLoop 可以被指派來服務多個 Channel

一個 Channel 只擁有一個 EventLoop

task (Runnable或Callable) 可以直接提交到 EventLoop 實現即刻或者延后執行。根據配置和可用的CPU核,可以創建多個 EventLoop 來優化資源利用。

一個 event 的本質決定了它將如何被處理;它可能從網絡協議棧傳送數據到你的應用,或者反過來,或者做一些完全不一樣的事情。但是 event 處理邏輯必須足夠通用和靈活,來對付所有可能的情況。

所以,在 Netty 4,所有的 I/O 操作和 event 都是由分配給 EventLoop 的那一個 Thread 來處理的。Netty 4 采用的線程模型,在同一個線程的 EventLoop 中處理所有發生的事。

7.3 EventLoopGroup

EventLoopGroup 負責分配 EventLoop 到新創建的 Channel

異步實現只用了很少 EventLoop,這幾個 EventLoop 被所有 Channel 共享

一但 Channel 被指派了一個 EventLoop,在它的整個生命周期過程中,都會用這個 EventLoop

為 Channel 的 I/O 和 event 提供服務的 EventLoop 都包含在一個 EventLoopGroup 中。EventLoop 創建和分配的方式根據傳輸實現的不同而有所不同。

異步實現只用了很少幾個 EventLoop(和它們關聯的線程),在目前 Netty 的模型中,這幾個 EventLoop 被所有 Channel 共享。這讓很多 Channel 被最少數量的線程服務,而不是每個 Channel 分配一個線程。

EventLoopGroup 負責分配一個 EventLoop 到每個新創建的 Channel。在目前的實現中,采用循環 (round-robin) 策略可以滿足一個平衡的分配,同一個 Eventloop 還可能會被分配到多個 Channel。

「本節參考」 第七章 EventLoop和線程模型

參考鏈接

《Netty in Action》中文版

Essential Netty in Action 《Netty 實戰(精髓)》

Netty 4.1 JavaDoc

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68250.html

相關文章

  • netty實戰》閱讀筆記(1)——Netty 的概念體系結構

    摘要:它使用了事件通知以確定在一組非阻塞套接字中有哪些已經就緒能夠進行相關的操作。目前,可以把看作是傳入入站或者傳出出站數據的載體。出站事件是未來將會觸發的某個動作的操作結果,這些動作包括打開或者關閉到遠程節點的連接將數據寫到或者沖刷到套接字。 netty的概念 定義 Netty 是一款異步的事件驅動的網絡應用程序框架,支持快速地開發可維護的高性能的面向協議的服務器和客戶端。我們可以很簡單的...

    solocoder 評論0 收藏0
  • Netty組件入門學習

    摘要:可以用來接收入站事件和數據,隨后使用應用程序的業務邏輯進行處理。因為用戶并不是關心所有的事件,因此提供了抽象類和。抽象類最常見的一個情況,你的應用程序會利用一個來接受解碼消息,并對該數據應用業務邏輯。 Channel、EventLoop和ChannelFuture Channel——Socket; EventLoop——控制流、多線程處理、并發 ChannelFuture異步通知 ...

    qpal 評論0 收藏0
  • Netty學習筆記(二)

    摘要:支持很多協議,并且提供用于數據處理的容器。我們已經知道由特定事件觸發。可專用于幾乎所有的動作,包括將一個對象轉為字節或相反,執行過程中拋出的異常處理。提供了一個容器給鏈并提供了一個用于管理沿著鏈入站和出站事件的流動。子類通過進行注冊。 前兩天寫了一點netty相關的知識,并寫了一個demo,但是對其原理還是沒有深入,今天我們來做一次研究吧 首先讓我們來認識一下netty的幾個核心人物吧...

    0x584a 評論0 收藏0
  • Netty4.x 源碼實戰系列(四):Pipeline全剖析

    摘要:在上一篇源碼實戰系列三全剖析中,我們詳細分析了的初始化過程,并得出了如下結論在中,每一個都有一個對象,并且其內部本質上就是一個雙向鏈表本篇我們將深入源碼內部,對其一探究竟,給大家一個全方位解析。 在上一篇《Netty4.x 源碼實戰系列(三):NioServerSocketChannel全剖析》中,我們詳細分析了NioServerSocketChannel的初始化過程,并得出了如下結論...

    13651657101 評論0 收藏0
  • ChannelPipeline 和 ChannelHandler

    摘要:概念與概念一致用以連接設備文件等的紐帶例如將網絡的讀寫客戶端發起連接主動關閉連接鏈路關閉獲取通信雙方的網絡地址等的類型主要有兩種非阻塞以及阻塞數據傳輸類型有兩種按事件消息傳遞以及按字節傳遞適用方類型也有兩種服務器以及客戶端還有一些根據傳輸協 ChannelHandler Channel Channel 概念與 java.nio.channel 概念一致, 用以連接IO設備 (socke...

    William_Sang 評論0 收藏0

發表評論

0條評論

VioletJack

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<