最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Netty分布式pipeline管道Handler的刪除邏輯操作

 更新時(shí)間:2022年03月28日 10:35:53   作者:向南是個(gè)萬人迷  
這篇文章主要為大家介紹了Netty分布式pipeline管道Handler的刪除邏輯操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

上一小節(jié)我們學(xué)習(xí)了添加handler的邏輯操作, 這一小節(jié)我們學(xué)習(xí)刪除handler的相關(guān)邏輯

刪除handler操作

如果用戶在業(yè)務(wù)邏輯中進(jìn)行ctx.pipeline().remove(this)這樣的寫法, 或者ch.pipeline().remove(new SimpleHandler())這樣的寫法, 則就是對(duì)handler進(jìn)行刪除, 我們學(xué)習(xí)過添加handler的邏輯, 所以對(duì)handler刪除操作理解起來也會(huì)比較容易

我們首先跟到defaultChannelPipeline的remove(handler)的方法中:

public final ChannelPipeline remove(ChannelHandler handler) {
    remove(getContextOrDie(handler));
    return this;
}

方法體里有個(gè)remove()方法, 傳入一個(gè) getContextOrDie(handler) 參數(shù), 這個(gè) getContextOrDie(handler) , 其實(shí)就是根據(jù)handler拿到其包裝類HandlerContext對(duì)象

我們跟到getContextPrDie這個(gè)方法中

private AbstractChannelHandlerContext getContextOrDie(ChannelHandler handler) {
    AbstractChannelHandlerContext ctx = (AbstractChannelHandlerContext) context(handler);
    //代碼省略
}

這里仍然會(huì)通過context(handler)方法去尋找, 再跟進(jìn)去:

public final ChannelHandlerContext context(ChannelHandler handler) {
    if (handler == null) {
        throw new NullPointerException("handler");
    }
    //從頭遍歷節(jié)點(diǎn)
    AbstractChannelHandlerContext ctx = head.next;
    for (;;) {
        if (ctx == null) {
            return null;
        }
        //找到handler
        if (ctx.handler() == handler) {
            return ctx;
        }
        ctx = ctx.next;
    }
}

這里我們看到尋找的方法也非常的簡單, 就是從頭結(jié)點(diǎn)開始遍歷, 遍歷到如果其包裝的handler對(duì)象是傳入的handler對(duì)象, 則返回找到的handlerContext

回到remove(handler)方法:

public final ChannelPipeline remove(ChannelHandler handler) {
    remove(getContextOrDie(handler));
    return this;
}

繼續(xù)跟到remove方法中:

private AbstractChannelHandlerContext remove(final AbstractChannelHandlerContext ctx) {
    //當(dāng)前刪除的節(jié)點(diǎn)不能是head, 也不能是tail
    assert ctx != head && ctx != tail;
    synchronized (this) {
        //執(zhí)行刪除操作
        remove0(ctx);
        if (!registered) {
            callHandlerCallbackLater(ctx, false);
            return ctx;
        }
        //回調(diào)刪除handler事件
        EventExecutor executor = ctx.executor();
        if (!executor.inEventLoop()) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    callHandlerRemoved0(ctx);
                }
            });
            return ctx;
        }
    }
    callHandlerRemoved0(ctx);
    return ctx;
}

首先要斷言刪除的節(jié)點(diǎn)不能是tail和head

然后通過remove0(ctx)進(jìn)行實(shí)際的刪除操作, 跟到remove0(ctx)中:

private static void remove0(AbstractChannelHandlerContext ctx) {
    //當(dāng)前節(jié)點(diǎn)的前置節(jié)點(diǎn)
    AbstractChannelHandlerContext prev = ctx.prev;
    //當(dāng)前節(jié)點(diǎn)的后置節(jié)點(diǎn)
    AbstractChannelHandlerContext next = ctx.next;
    //前置節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)設(shè)置為后置節(jié)點(diǎn)
    prev.next = next;
    //后置節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)設(shè)置為前置節(jié)點(diǎn)
    next.prev = prev;
}

這里的操作也非常簡單, 做了一個(gè)指針移動(dòng)的操作, 熟悉雙向鏈表的小伙伴應(yīng)該不會(huì)陌生, 刪除節(jié)點(diǎn)邏輯大概如下圖所示:

回到remove(ctx)方法

private AbstractChannelHandlerContext remove(final AbstractChannelHandlerContext ctx) {
    //當(dāng)前刪除的節(jié)點(diǎn)不能是head, 也不能是tail
    assert ctx != head && ctx != tail;
    synchronized (this) {
        //執(zhí)行刪除操作
        remove0(ctx);
        if (!registered) {
            callHandlerCallbackLater(ctx, false);
            return ctx;
        }
        //回調(diào)刪除handler事件
        EventExecutor executor = ctx.executor();
        if (!executor.inEventLoop()) {
            executor.execute(new Runnable() {
                @Override
                public void run() {
                    callHandlerRemoved0(ctx);
                }
            });
            return ctx;
        }
    }
    callHandlerRemoved0(ctx);
    return ctx;
}

我們繼續(xù)往下看, 如果當(dāng)前線程不是eventLoop線程則將回調(diào)刪除事件封裝成task放在taskQueue中讓eventLoop線程進(jìn)行執(zhí)行, 否則, 則直接執(zhí)行回調(diào)刪除事件

跟到callHandlerRemoved0(ctx)方法中:

private void callHandlerRemoved0(final AbstractChannelHandlerContext ctx) {
    try {
        try {
            //調(diào)用handler的handlerRemoved方法
            ctx.handler().handlerRemoved(ctx);
        } finally {
            //將當(dāng)前節(jié)點(diǎn)狀態(tài)設(shè)置為已移除
            ctx.setRemoved();
        }
    } catch (Throwable t) {
        fireExceptionCaught(new ChannelPipelineException(
                ctx.handler().getClass().getName() + ".handlerRemoved() has thrown an exception.", t));
    }
}

與添加handler的邏輯一樣, 這里會(huì)調(diào)用當(dāng)前handler的handlerRemoved方法, 如果用戶沒有重寫該方法, 則會(huì)調(diào)用其父類的方法, 方法體在ChannelHandlerAdapter類中有定義, 我們跟進(jìn)去

public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
}

同添加handler一樣, 也是一個(gè)空實(shí)現(xiàn), 這里用戶可以通過重寫來添加自己需要的邏輯

以上就是刪除handler的相關(guān)操作,更多關(guān)于Netty分布式pipeline管道刪除Handler的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析

    java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析

    這篇文章主要為大家介紹了java底層JDK?Logging日志模塊處理細(xì)節(jié)深入分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • java:無法訪問org.springframework.boot.SpringApplication的解決方法

    java:無法訪問org.springframework.boot.SpringApplication的解決方法

    這篇文章主要給大家介紹了關(guān)于java:無法訪問org.springframework.boot.SpringApplication的解決方法,文中通過實(shí)例代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Spring Boot攔截器和過濾器實(shí)例解析

    Spring Boot攔截器和過濾器實(shí)例解析

    這篇文章主要介紹了Spring Boot攔截器和過濾器實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • SpringBoot集成JWT實(shí)現(xiàn)登陸驗(yàn)證的方法詳解

    SpringBoot集成JWT實(shí)現(xiàn)登陸驗(yàn)證的方法詳解

    JSON?Web?Token(JWT)是一個(gè)開放的標(biāo)準(zhǔn)(RFC?7519),它定義了一個(gè)緊湊且自包含的方式,用于在各方之間以JSON對(duì)象安全地傳輸信息。本文將利用SpringBoot集成JWT實(shí)現(xiàn)登陸驗(yàn)證,感興趣的可以了解一下
    2022-05-05
  • Java遞歸造成的堆棧溢出問題及解決方案

    Java遞歸造成的堆棧溢出問題及解決方案

    在Java中,遞歸造成的堆棧溢出問題通常是因?yàn)檫f歸調(diào)用的深度過大,導(dǎo)致調(diào)用棧空間不足,解決這類問題的一種常見方法是使用非遞歸的方式重寫算法,即使用迭代替代遞歸,需要的朋友可以參考下
    2024-08-08
  • Java的HashMap源碼解析

    Java的HashMap源碼解析

    這篇文章主要介紹了Java的HashMap源碼解析,HashMap是一個(gè)用于存儲(chǔ)Key-Value鍵值對(duì)的集合,每一個(gè)鍵值對(duì)是一個(gè)Node,后臺(tái)是用一個(gè)Node數(shù)組來存放數(shù)據(jù),這個(gè)Node數(shù)組就是HashMap的主干,需要的朋友可以參考下
    2023-11-11
  • java中對(duì)字符串每個(gè)字符統(tǒng)計(jì)的方法

    java中對(duì)字符串每個(gè)字符統(tǒng)計(jì)的方法

    java中對(duì)字符串每個(gè)字符統(tǒng)計(jì)的方法,需要的朋友可以參考一下
    2013-03-03
  • @MapperScan注解與@Mapper注解的使用

    @MapperScan注解與@Mapper注解的使用

    這篇文章主要介紹了@MapperScan注解與@Mapper注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 部署Java在服務(wù)器端的EJB組件的方法

    部署Java在服務(wù)器端的EJB組件的方法

    這篇文章主要介紹了部署Java在服務(wù)器端的EJB組件的方法,同時(shí)給出了簡單的客戶端調(diào)用方法,需要的朋友可以參考下
    2015-11-11
  • SpringBoot項(xiàng)目中忽略某屬性返回?cái)?shù)據(jù)給前端

    SpringBoot項(xiàng)目中忽略某屬性返回?cái)?shù)據(jù)給前端

    在Spring Boot中,保護(hù)敏感信息和減少數(shù)據(jù)傳輸是很重要的,我們可以使用多種方法來忽略返回?cái)?shù)據(jù)中的字段,無論是使用@JsonIgnore注解、Projection投影、@JsonIgnoreProperties注解還是自定義序列化器,都能達(dá)到我們的目的,在實(shí)際應(yīng)用中,根據(jù)具體場景和需求選擇合適的方法
    2024-05-05

最新評(píng)論

奇台县| 松潘县| 凤冈县| 广河县| 玉山县| 广河县| 昔阳县| 八宿县| 保德县| 宣恩县| 六安市| 南昌市| 汤原县| 乌兰察布市| 绩溪县| 田林县| 岳普湖县| 喜德县| 博客| 和田市| 吉林省| 寻乌县| 勃利县| 满洲里市| 桦南县| 曲松县| 株洲市| 象州县| 本溪| 南投县| 河北省| 车致| 延长县| 武城县| 杭州市| 江川县| 平泉县| 新营市| 崇明县| 新野县| 融水|