Netty5.x 和3.x、4.x的區別及注意事項html
(官方翻譯)java
本文檔列出了Netty5新版本中值得注意變化和新特性列表。幫助你的應用更好的適應新的版本。
不像Netty3.x和4.x之間的變化,5.x沒有那麼大的變化,不過也取得了其簡化設計中的一些突破性進展.。咱們力求儘量平滑的從4.x版本過分到5.x版本,若是你在遷移過程當中遇到任何問題,請告知咱們。
核心變化
支持Android
提供了:
- 移動設備變成更增強大
- 經過Ice Cream Sandwich解決了在ADK中最著名的與NIO和SSLEngine相關的問題,且
- 用戶顯然想要重用他們應用中的的編解碼和處理器代碼。
咱們決定官方支持Android(4.0及以上版本)
簡化處理器層次
ChannelInboundHandler和ChannelOutboundHandler整合爲ChannelHandler。ChannelHandler如今包含輸入和輸出的處理方法。
ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter已被廢棄,由 ChannelHandlerAdapter代替。
因爲如今沒法區分處理器(handler) 是輸入仍是輸出的處理器,CombinedChannelDuplexHandler如今由 ChannelHandlerAppender代替。
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實現。
EmbeddedChannel的易用性
EmbeddedChannel中的readInbound()和readOutbound()方法返回專門類型的參數,所以你沒必要在轉換他們的返回值。這能夠簡化你的測試用例代碼。
使用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多部分的編解碼
地址:http://blog.csdn.net/hills/article/details/46827393 ;