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

Netty啟動流程服務(wù)端channel初始化源碼分析

 更新時間:2022年03月25日 10:08:08   作者:向南是個萬人迷  
這篇文章主要為大家介紹了Netty啟動流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前文傳送門 Netty分布式server啟動流程

服務(wù)端channel初始化

回顧上一小節(jié)initAndRegister()方法

final ChannelFuture initAndRegister() {
    Channel channel = null;
    try {
        //創(chuàng)建channel
        channel = channelFactory.newChannel();
        //初始化channel
        init(channel);
    } catch (Throwable t) {
        //忽略非關(guān)鍵代碼
    }
    ChannelFuture regFuture = config().group().register(channel);
    //忽略非關(guān)鍵代碼
    return regFuture;
}

簡單回顧上一小節(jié)內(nèi)容, 我們跟完了創(chuàng)建channel的步驟, 知道了Netty的NioServerSocketChannel和jdk的ServerSocketChannel之間的關(guān)系, NioServerSocketChannel和jdk的channel是組合關(guān)系, 在其父類AbstractChannel中有jdk的channel的一個成員變量, 通過創(chuàng)建netty的channel為jdk的channel賦值

init(Channel)方法

我們繼續(xù)往下看init(Channel)方法

因為是ServerBootstrap對象調(diào)用的init()方法, 所以我們跟到ServerBootstrap類的init()方法中:

void init(Channel channel) throws Exception {
    //獲取用戶定義的選項(1)
    final Map<ChannelOption<?>, Object> options = options0();
    synchronized (options) {
        channel.config().setOptions(options);
    }

    //獲取用戶定義的屬性(2)
    final Map<AttributeKey<?>, Object> attrs = attrs0();
    synchronized (attrs) {
        for (Entry<AttributeKey<?>, Object> e: attrs.entrySet()) {
            @SuppressWarnings("unchecked")
            AttributeKey<Object> key = (AttributeKey<Object>) e.getKey();
            channel.attr(key).set(e.getValue());
        }
    }
    //獲取channel的pipline(3)
    ChannelPipeline p = channel.pipeline();
    //work線程組(4)
    final EventLoopGroup currentChildGroup = childGroup;
    //用戶設(shè)置的Handler(5)
    final ChannelHandler currentChildHandler = childHandler;
    final Entry<ChannelOption<?>, Object>[] currentChildOptions;
    final Entry<AttributeKey<?>, Object>[] currentChildAttrs;
    //選項轉(zhuǎn)化為Entry對象(6)
    synchronized (childOptions) { 
        currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size()));
    }
    //屬性轉(zhuǎn)化為Entry對象(7)
    synchronized (childAttrs) { 
        currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(childAttrs.size()));
    }
    //添加服務(wù)端handler(8)
    p.addLast(new ChannelInitializer<Channel>() {
        //初始化channel
        @Override
        public void initChannel(Channel ch) throws Exception {
            final ChannelPipeline pipeline = ch.pipeline();
            ChannelHandler handler = config.handler();
            if (handler != null) { 
                pipeline.addLast(handler);
            } 
            ch.eventLoop().execute(new Runnable() {
                @Override
                public void run() { 
                    pipeline.addLast(new ServerBootstrapAcceptor(
                            currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs));
                }
            });
        }
    });
}

初看起來代碼好長, 其實并不復(fù)雜, 這里對每一步進行一個簡述:

步驟(1), (2)是獲取的用戶代碼中定義的選項和屬性

步驟(3)是獲取channel的pipeline, 這個channel就是上一小節(jié)我們學(xué)習(xí)創(chuàng)建的NioServerSocketChannel, 我們知道每個channel都有個pipeline的屬性, 是AbstractChannel的成員變量, 而這里的pipeline()就是獲取其與channel綁定的pipeline, 這個pipline, 會在后面的章節(jié)中講到

步驟(4)是獲取worker線程組, 我們知道這個worker線程組就是在用戶代碼中創(chuàng)建的NioEventLoopGroup, 后來在ServerBootstrap的group()方法中賦值為ServerBootstrap的成員變量, 而這里是獲取其成員變量, 并賦值到局部變量currentChildGroup中, NioEventLoop相關(guān)知識會在后面的章節(jié)講到

步驟(6), (7)是將選項和屬性轉(zhuǎn)化成Entry對象

步驟(8)是添加服務(wù)端Handler, 是通過和channel綁定的pipeline調(diào)用addLast()方法進行添加, 傳入一個ChannelInitializer類的子類對象, 至于addLast方法是做什么的, ChannelInitializer是做什么的, 后緒章節(jié)都會給大家詳細(xì)剖析, 這里不必深究

這一小節(jié)我們了解了有關(guān)channel初始化的過程, 我們目前只需了解其大概步驟, 有關(guān)addLast的邏輯會在后面的章節(jié)進行詳細(xì)剖析

以上就是Netty啟動流程服務(wù)端channel初始化源碼分析的詳細(xì)內(nèi)容,更多關(guān)于Netty啟動流程服務(wù)端channel初始化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MybatisPlus?QueryWrapper常用方法實例

    MybatisPlus?QueryWrapper常用方法實例

    MyBatis-Plus(opens new window)是一個MyBatis(opens new window)的增強工具,在 MyBatis的基礎(chǔ)上只做增強不做改變,為簡化開發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于MybatisPlus?QueryWrapper常用方法的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Java對數(shù)器驗證算法詳解

    Java對數(shù)器驗證算法詳解

    這篇文章主要介紹了Java對數(shù)器驗證算法,Java對數(shù)函數(shù)的計算方法非常有問題,然而在API中卻有驚人的誤差。但是假如運用了以下的方法,用Java處理數(shù)字所碰到的小麻煩就可以輕而易舉的解決了
    2023-04-04
  • Spring中@Primary注解的作用詳解

    Spring中@Primary注解的作用詳解

    這篇文章主要介紹了Spring中@Primary注解的作用詳解,@Primary 注解是Spring框架中的一個注解,用于標(biāo)識一個Bean作為默認(rèn)的實現(xiàn)類,當(dāng)存在多個實現(xiàn)類時,通過使用@Primary注解,可以指定其中一個作為默認(rèn)的實現(xiàn)類,以便在注入時自動選擇該實現(xiàn)類,需要的朋友可以參考下
    2023-10-10
  • java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析

    java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析

    本文主要介紹了java中樂觀鎖與悲觀鎖區(qū)別及使用場景分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Java9中對集合類擴展的of方法解析

    Java9中對集合類擴展的of方法解析

    這篇文章主要介紹了Java9 中對集合類擴展的of方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java發(fā)送http get請求的兩種方式

    java發(fā)送http get請求的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java發(fā)送http get請求的兩種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 通過實例學(xué)習(xí)Spring @Required注釋原理

    通過實例學(xué)習(xí)Spring @Required注釋原理

    這篇文章主要介紹了通過實例學(xué)習(xí)Spring @Required注釋原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Java多線程之ThreadLocal原理總結(jié)

    Java多線程之ThreadLocal原理總結(jié)

    這篇文章主要介紹了Java多線程ThreadLocal原理,同一個ThreadLocal所包含的對象,在不同的Thread中有不同的副本,文章中有詳細(xì)的代碼示例,需要的朋友參考一下
    2023-04-04
  • MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問題

    MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問題

    這篇文章主要介紹了MyBatis之foreach標(biāo)簽的用法及多種循環(huán)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Mybatis插入Oracle數(shù)據(jù)庫日期型數(shù)據(jù)過程解析

    Mybatis插入Oracle數(shù)據(jù)庫日期型數(shù)據(jù)過程解析

    這篇文章主要介紹了Mybatis插入Oracle數(shù)據(jù)庫日期型數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09

最新評論

高尔夫| 乌拉特中旗| 嘉峪关市| 谢通门县| 西贡区| 临澧县| 呼玛县| 通山县| 广州市| 大埔区| 治多县| 那曲县| 博白县| 色达县| 沈丘县| 庐江县| 绥棱县| 称多县| 盐津县| 东乡族自治县| 林口县| 昔阳县| 金秀| 清镇市| 醴陵市| 延寿县| 凤山市| 昌吉市| 丰顺县| 临清市| 大冶市| 巍山| 鱼台县| 北流市| 西峡县| 马尔康县| 衡阳市| 苗栗市| 丽水市| 乌兰察布市| 出国|