<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
前文回顧:Netty分散式編碼器及寫資料事件處理
同解碼器一樣, 編碼器中也有一個抽象類叫MessageToByteEncoder, 其中定義了編碼器的骨架方法, 具體編碼邏輯交給子類實現
解碼器同樣也是個handler, 將寫出的資料進行擷取處理, 我們在學習pipeline中我們知道, 寫資料的時候會傳遞write事件, 傳遞過程中會呼叫handler的write方法, 所以編碼器碼器可以重寫write方法, 將資料編碼成二進位制位元組流然後再繼續傳遞write事件
public abstract class MessageToByteEncoder<I> extends ChannelOutboundHandlerAdapter{ //省略類體 }
這裡繼承ChannelOutboundHandlerAdapter, 說明是個outBoundhandler, 我們知道write事件是個outBound事件, 而outBound事件只能通過outBoundHandler進行傳輸
write事件傳播過程中要呼叫handler的write方法
我們跟到MessageToByteEncoder的write方法中:
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { ByteBuf buf = null; try { if (acceptOutboundMessage(msg)) { @SuppressWarnings("unchecked") I cast = (I) msg; buf = allocateBuffer(ctx, cast, preferDirect); try { encode(ctx, cast, buf); } finally { ReferenceCountUtil.release(cast); } if (buf.isReadable()) { ctx.write(buf, promise); } else { buf.release(); ctx.write(Unpooled.EMPTY_BUFFER, promise); } buf = null; } else { ctx.write(msg, promise); } } catch (EncoderException e) { throw e; } catch (Throwable e) { throw new EncoderException(e); } finally { if (buf != null) { buf.release(); } } }
首先通過 if (acceptOutboundMessage(msg)) 判斷當前物件是否可處理
如果可處理, 則進入if塊中的邏輯, 如果不能處理, 則進入else塊, 通過ctx.write(msg, promise)繼續傳遞write事件
我們看if塊中
I cast = (I) msg 這裡是強制型別轉換, 轉換成I型別, I型別是個泛型, 具體型別由使用者定義
buf = allocateBuffer(ctx, cast, preferDirect) 這裡進行緩衝區分配
protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, @SuppressWarnings("unused") I msg, boolean preferDirect) throws Exception { if (preferDirect) { return ctx.alloc().ioBuffer(); } else { return ctx.alloc().heapBuffer(); } }
這裡會直接通過ctx的記憶體分配器進行記憶體分配, 通過判斷preferDirect來分配堆記憶體或者堆外記憶體, 預設情況下是分配堆外記憶體
有關記憶體分配, 我們之前已經做過相關的剖析
回到write方法中:
記憶體分配結束之後會呼叫encode(ctx, cast, buf)方法進行編碼, 該類由子類實現
子類可以通過繼承該類, 重寫encode方法, 將引數物件cast編碼成位元組寫入到傳入的ByteBuf中, 就完成了編碼工作
編碼完成後後, 會通過ReferenceCountUtil.release(cast)將cast物件釋放
if (buf.isReadable()) 這裡判斷buf是否有可讀位元組, 如果有可讀位元組, 則繼續傳遞write事件
如果沒有可讀位元組, 則將buf進行釋放, 繼續傳播write事件, 傳遞一個空的ByteBuf
最後將buf設定為空
以上就是有關抽象編碼器的抽象邏輯, 具體的編碼邏輯還需要其子類去做,更多關於Netty分散式抽象編碼器MessageToByteEncoder的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45