Netty5.x中新增和值得注意的點

來源:互聯網
上載者:User

標籤:android   style   http   color   java   使用   io   strong   

支援Android   提供了:
  •  行動裝置變成更加強大
  • 通過Ice Cream Sandwich解決了在ADK中最著名的與NIO和SSLEngine相關的問題,且
  • 使用者顯然想要重用他們應用中的的編解碼和處理器代碼。
我們決定官方支援Android(4.0及以上版本)   簡化處理器層次   ChannelInboundHandler和ChannelOutboundHandler整合為ChannelHandler。ChannelHandler現在包含輸入和輸出的處理方法。   ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter已被廢棄,由 ChannelHandlerAdapter代替。   由於現在無法區分處理器(handler) 是輸入還是輸出的處理器,CombinedChannelDuplexHandler現在由 ChannelHandlerAppender代替。   更多相關變化,可參考 https://github.com/netty/netty/pull/1999   channelRead0() → messageReceived()   我知道。這是一個愚蠢的錯誤。如果你使用了SimpleChannelInboundHandler,你需要把channelRead0()重新命名為messageReceived()。   廢棄中移除的   Channel.deregister()已被移除。不再生效和被使用。取而代之的,我們將允許Channel被充註冊到不同的事件迴圈。   ChannelHandlerContext.attr(..) == Channel.attr(..)   Channel和ChannelHandlerContext類都實現了AttributeMap介面,使使用者可以在其上關聯一個或多個屬性。有時會讓使用者感到困惑的是Channel和ChannelHandlerContext都有其自己的儲存使用者定義屬性的容器。例如,即使你通過Channel.attr(KEY_X).set(valueX)給屬性‘KEY_X’賦值,你卻無法通過ChannelHandlerContext.attr(KEY_X).get()方法擷取到值。反之亦是如此。這種行為不僅僅令人不解而且還浪費記憶體。   為瞭解決這個問題,我們決定每個Channel內部僅保留一個map。AttributeMap總是用AttributeKey作為它的key。AttributeKey確保鍵的唯一性,因此每個Channel中如果存在一個以上的屬性容易是多餘的。只要使用者把他自己的AttributeKey定義成ChannelHandler的private static final變數,就不會有出現重複key的風險。   更簡單更精確的緩衝區泄漏追蹤     之前,尋找緩衝區泄漏是很困難的,並且泄漏的警告資訊也不是很有協助。現在我們有了增強泄漏報告機制,該機制會在增長超過上限時觸發。   更多的資訊可查看:http://netty.io/wiki/reference-counted-objects.html 。由於該特性十分重要,所以也移植入了4..0.14.Final版中。   PooledByteBufAllocator成為預設的allocator   在4.x版本中,UnpooledByteBufAllocator是預設的allocator,儘管其存在某些限制。現在PooledByteBufAllocator已經廣泛使用一段時間,並且我們有了增強緩衝區泄漏追蹤機制,所以是時候讓PooledByteBufAllocator成為預設了。   全域唯一的Channel ID     每個Channel現在有了全域唯一的ID,其產生的依據是:      * MAC地址(EUI-48或是EUI-64),最好是全域唯一的,    * 當前進程的ID    * System#currentTimeMillis()    * System#nanoTime()    * 隨機的32位整數,以及    * 系列遞增的32位整數   可通過Channel.id()方法擷取Channel的ID。   更靈活的執行緒模式     增加了新的ChannelHandlerInvoker介面,用於使使用者可以選擇使用哪個線程呼叫事件處理方法。替代之前的在向ChannelPipeline添加 ChannelHandler時指定一個EventExecutor的方式,使用該特性需要指定一個使用者自訂的 ChannelHandlerInvoker實現。   關於該變化更多的資訊,可參考: https://github.com/netty/netty/commit/132af3a485015ff912bd567a47881814d2ce1828   EmbeddedChannel的易用性   EmbeddedChannel中的readInbound()和readOutbound()方法返回專門類型的參數,因此你不必在轉換他們的傳回值。這可以簡化你的測試案例代碼。
EmbeddedChannel ch = ...; // BEFORE: FullHttpRequest req = (FullHttpRequest) ch.readInbound(); // AFTER: FullHttpRequest req = ch.readInbound();
  使用Executor代替ThreadFactory     有些應用要求使用者使用Executor運行他們的任務。4.x版本要求使用者在建立事件迴圈(event loop)時指定ThreadFacotry,現在不再是這樣了。   關於該變化的更多資訊,可參考:https://github.com/netty/netty/pull/1762   Class loader友好化   一些類型,如AttributeKey對於在容器環境下啟動並執行應用是不友好的,現在不是了。   編解碼和處理器(handlers)      * XmlFrameDecoder支援流式的XML文檔      * 二進位的memcache協議編解碼    * 支援SPDY/3.1 (也移植到了4.x版本)    * 重構了HTTP多部分的編解碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.