從零開始學netty——為何重寫方法不一樣
相信大家看了decoder部分的時候肯定有點怪異,尤其是發現重寫的方法是channelRead0。方法上還帶了數字,完全不如channelRead好理解,下面的內容就是解答這個疑惑的。
第一個程式繼承的是ChannelInboundHandlerAdapter類,第二個程式是繼承的是SimpleChannelInboundHandler,SimpleChannelInboundHandler是有泛型引數的。可以指定一個具體的型別引數,透過decoder配合使用,非常方便。ChannelInboundHandlerAdapter則是直接操作byte陣列的。
ChannelInboundHandlerAdapter extends ChannelHandlerAdapter implements ChannelInboundHandler
SimpleChannelInboundHandler extends ChannelInboundHandlerAdapter
上圖就是兩個類的宣告,SimpleChannelInboundHandler是繼承ChannelInboundHandlerAdapter的。也就是說SimpleChannelInboundHandler也擁有ChannelInboundHandlerAdapter的方法。
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
boolean release = true;
try {
if (acceptInboundMessage(msg)) {//型別匹配
I imsg = (I) msg;
channelRead0(ctx, imsg);
} else {
release = false;
ctx.fireChannelRead(msg);
}
} finally {
if (autoRelease && release) {
ReferenceCountUtil.release(msg);//釋放引用
}
}
}
SimpleChannelInboundHandler的channelRead相比SimpleChannelInboundHandler而言,主要做了型別匹配以及用完之後釋放指向儲存該訊息的 ByteBuf 的記憶體引用。
相比之下,ChannelInboundHandlerAdapter 好像一無是處,畢竟他要自己處理資源的釋放,例如如下的呼叫
buf.release();
如果說channelRead都是同步操作的話,SimpleChannelInboundHandler是不錯的選擇,如果操作是非同步的話,那他的邏輯就有點麻煩了,例如你把資料交給另外的執行緒處理了,還沒處理就會釋放了 。這裡必須說明一個問題,他的回收和jvm的垃圾回收還不完全是一回事。netty是自己做了引用計數的操作。
buf.refCnt();
透過上面的api就可以獲取到計數的個數。具體的引用計數的部分,不知道也不影響netty的學習,這個點後面具體再說。ChannelInboundHandlerAdapter 處理自由的優點也就提現出來了,可以更好的處理更多的特定場景。
SimpleChannelInboundHandler的好處是可以處理不同的型別物件,並且可以做釋放。ChannelInboundHandlerAdapter 的好處則是更自由,在非同步的場景下更適合。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2800851/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《從零開始學Swift》學習筆記(Day 45)——重寫方法Swift筆記
- 幾何庫從零開始
- 從零開始netty學習筆記之BIONetty筆記
- 從零開始netty學習筆記之protobufNetty筆記
- 《從零開始學Swift》學習筆記(Day 44)——重寫屬性Swift筆記
- 《從零開始學Swift》學習筆記(Day 46)——下標重寫Swift筆記
- 從零開始netty學習筆記之netty簡單demoNetty筆記
- 從零開始寫一個ExporterExport
- 從零開始寫JavaScript框架(二)JavaScript框架
- 從零開始寫JavaScript框架(一)JavaScript框架
- 從零開始仿寫一個抖音App——開始APP
- 從零開始學習KafkaKafka
- 從零開始學習機器學習機器學習
- 【ROS】從零開始學ROSROS
- 從零開始學習laravelLaravel
- 從零開始學PythonPython
- ?從零開始學習webpack系列五(解析打包樣式)Web
- 從零開始寫一個微前端框架-樣式隔離篇前端框架
- 從零開始編寫指令碼引擎指令碼
- 從零開始寫一個網頁網頁
- 從零開始netty學習筆記之TCP粘包和拆包Netty筆記TCP
- 從零開始寫 Docker(十四)---重構:實現容器間 rootfs 隔離Docker
- 從零開始學 Spring BootSpring Boot
- 從零開始學golang之udpGolangUDP
- 從零開始學golang之 PrimGolang
- 從零開始學golang之TCPGolangTCP
- eclipse學習從零開始Eclipse
- Python從零開始——學習Python的個人方法Python
- 從零開始手寫Koa2框架框架
- 如何從零開始寫一個網站網站
- 從零開始怎麼寫androidnativeservice?Android
- 《從零開始學Swift》學習筆記(Day 36)——靜態方法Swift筆記
- 從零開始學Electron筆記(一)筆記
- 從零開始學Electron筆記(二)筆記
- 從零開始學Electron筆記(七)筆記
- 從零開始學Electron筆記(六)筆記
- 從零開始學Electron筆記(三)筆記
- 從零開始學Electron筆記(四)筆記