91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Netty分布式抽象編碼器MessageToByteEncoder邏輯的示例分析

發布時間:2022-03-29 13:47:04 來源:億速云 閱讀:137 作者:小新 欄目:開發技術

小編給大家分享一下Netty分布式抽象編碼器MessageToByteEncoder邏輯的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

MessageToByteEncoder

同解碼器一樣, 編碼器中也有一個抽象類叫MessageToByteEncoder, 其中定義了編碼器的骨架方法, 具體編碼邏輯交給子類實現

解碼器同樣也是個handler, 將寫出的數據進行截取處理, 我們在學習pipeline中我們知道, 寫數據的時候會傳遞write事件, 傳遞過程中會調用handler的write方法, 所以編碼器碼器可以重寫write方法, 將數據編碼成二進制字節流然后再繼續傳遞write事件

首先看MessageToByteEncoder的類聲明

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) 這里進行緩沖區分配

跟到allocateBuffer方法中

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邏輯的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

镇赉县| 滨州市| 佛教| 万年县| 玉林市| 城固县| 阆中市| 沅陵县| 金乡县| 宝坻区| 庆阳市| 剑阁县| 上虞市| 三台县| 莒南县| 霸州市| 卢氏县| 得荣县| 大庆市| 巴东县| 尼玛县| 抚松县| 六盘水市| 太仆寺旗| 囊谦县| 河间市| 东乌珠穆沁旗| 宜川县| 佛教| 阿勒泰市| 昌平区| 阜城县| 旅游| 德格县| 巴中市| 商南县| 保靖县| 五大连池市| 晋江市| 托里县| 平武县|