天天看點

Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

1 ChannelInboundHandlerAdapter

Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

ChannelInboundHandlerAdapter直接操作byte數組。

ChannelInboundHandlerAdapter 好像一無是處,畢竟他要自己處理資源的釋放

buf.release();      

如果channelRead都是同步操作,SimpleChannelInboundHandler是不錯的選擇,如果操作是異步的話,那他的邏輯就有點麻煩了,例如你把資料交給另外的線程處理了,還沒處理就會釋放了 。這裡必須說明一個問題,他的回收和jvm的垃圾回收還不完全是一回事。netty是自己做了引用計數的操作。

buf.refCnt();      

通過上面的api就可以擷取到計數的個數。ChannelInboundHandlerAdapter 處理自由的優點也就提現出來了,可以更好的處理更多的特定場景。

是以ChannelInboundHandlerAdapter 的好處則是更自由,在異步的場景下更适合。

2 SimpleChannelInboundHandler

  • SimpleChannelInboundHandler有泛型參數,配合decoder使用更佳。
Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

SimpleChannelInboundHandler主要還多做了類型比對以及用完之後釋放指向儲存該消息的 ByteBuf 的記憶體引用。

Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

SimpleChannelInboundHandler的好處是可以處理不同的類型對象,并且可以做釋放。

那麼源碼中可見如果對于不接受的消息類型,else分支也會釋放記憶體嗎?讓我們直接看 tailContext 即可。

Netty源碼解析SimpleChannelInboundHandler1 ChannelInboundHandlerAdapter2 SimpleChannelInboundHandler

/