欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前文傳送門(mén) Netty分布式server啟動(dòng)流程

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

init(Channel)方法

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

因?yàn)槭荢erverBootstrap對(duì)象調(diào)用的init()方法, 所以我們跟到ServerBootstrap類(lèi)的init()方法中:

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

    //獲取用戶(hù)定義的屬性(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;
    //用戶(hù)設(shè)置的Handler(5)
    final ChannelHandler currentChildHandler = childHandler;
    final Entry<ChannelOption<?>, Object>[] currentChildOptions;
    final Entry<AttributeKey<?>, Object>[] currentChildAttrs;
    //選項(xiàng)轉(zhuǎn)化為Entry對(duì)象(6)
    synchronized (childOptions) { 
        currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size()));
    }
    //屬性轉(zhuǎn)化為Entry對(duì)象(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));
                }
            });
        }
    });
}

初看起來(lái)代碼好長(zhǎng), 其實(shí)并不復(fù)雜, 這里對(duì)每一步進(jìn)行一個(gè)簡(jiǎn)述:

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

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

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

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

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

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

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

相關(guān)文章

  • Spring+Vue整合UEditor富文本實(shí)現(xiàn)圖片附件上傳的方法

    Spring+Vue整合UEditor富文本實(shí)現(xiàn)圖片附件上傳的方法

    這篇文章主要介紹了Spring+Vue整合UEditor富文本實(shí)現(xiàn)圖片附件上傳的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • spring boot mybatis枚舉映射示例代碼

    spring boot mybatis枚舉映射示例代碼

    這篇文章主要給大家介紹了關(guān)于spring boot mybatis枚舉映射的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java實(shí)現(xiàn)快速排序圖文詳解

    java實(shí)現(xiàn)快速排序圖文詳解

    網(wǎng)上關(guān)于快速排序的算法原理和算法實(shí)現(xiàn)都比較多,不過(guò)java是實(shí)現(xiàn)并不多,而且部分實(shí)現(xiàn)很難理解,和思路有點(diǎn)不搭調(diào)。所以整理了這篇文章。如果有不妥之處還請(qǐng)建議
    2021-08-08
  • java中的阻塞隊(duì)列應(yīng)用場(chǎng)景及代碼實(shí)例

    java中的阻塞隊(duì)列應(yīng)用場(chǎng)景及代碼實(shí)例

    這篇文章主要介紹了java中的阻塞隊(duì)列應(yīng)用場(chǎng)景及代碼實(shí)例阻塞隊(duì)列是一種特殊的隊(duì)列,它提供了線程安全的操作,并在隊(duì)列為空或滿(mǎn)時(shí)提供了阻塞的功能,阻塞隊(duì)列通常用于多線程場(chǎng)景,其中生產(chǎn)者線程向隊(duì)列中添加元素,而消費(fèi)者線程從隊(duì)列中獲取元素,需要的朋友可以參考下
    2024-01-01
  • Java 反射(Reflect)詳解

    Java 反射(Reflect)詳解

    這篇文章主要介紹了JAVA 反射機(jī)制的相關(guān)知識(shí),文中講解的非常細(xì)致,代碼幫助大家更好的理解學(xué)習(xí),感興趣的朋友可以了解下
    2021-09-09
  • Mybatis分頁(yè)插件使用方法詳解

    Mybatis分頁(yè)插件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Mybatis分頁(yè)插件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的圖文教程

    IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的圖文教程

    這篇文章主要介紹了IntelliJ IDEA像Eclipse一樣打開(kāi)多個(gè)項(xiàng)目的方法圖文教程講解,需要的朋友可以參考下
    2018-03-03
  • Java的作業(yè)調(diào)度類(lèi)庫(kù)Quartz基本使用指南

    Java的作業(yè)調(diào)度類(lèi)庫(kù)Quartz基本使用指南

    這篇文章主要介紹了Java的作業(yè)調(diào)度類(lèi)庫(kù)Quartz基本使用指南,Quartz能夠讓類(lèi)按照指定的計(jì)劃順序執(zhí)行,需要的朋友可以參考下
    2016-03-03
  • Java中遍歷ConcurrentHashMap的四種方式詳解

    Java中遍歷ConcurrentHashMap的四種方式詳解

    這篇文章主要介紹了Java中遍歷ConcurrentHashMap的四種方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 23種設(shè)計(jì)模式(4) java生成器模式

    23種設(shè)計(jì)模式(4) java生成器模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java生成器模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評(píng)論