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

Netty分布式源碼分析監(jiān)聽讀事件

 更新時(shí)間:2022年03月28日 08:58:33   作者:向南是個(gè)萬人迷  
這篇文章主要介紹了Netty分布式監(jiān)聽讀事件方法的代碼跟蹤解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前文傳送門:NioSocketChannel注冊(cè)到selector

我們回到AbstractUnsafe的register0()方法:

private void register0(ChannelPromise promise) {
    try {
        //省略代碼
        //做實(shí)際的注冊(cè)
        doRegister();
        neverRegistered = false;
        registered = true;
        //觸發(fā)事件
        pipeline.invokeHandlerAddedIfNeeded();
        safeSetSuccess(promise);
        //觸發(fā)注冊(cè)成功事件
        pipeline.fireChannelRegistered();
        if (isActive()) {
            if (firstRegistration) {
                //傳播active事件(4)
                pipeline.fireChannelActive();
            } else if (config().isAutoRead()) {
                beginRead();
            }
        }
    } catch (Throwable t) {
        //省略代碼
    }
}

doRegister()做完實(shí)際的注冊(cè)之后, 會(huì)走到if (isActive())這個(gè)判斷, 因?yàn)檫@個(gè)時(shí)候鏈路已經(jīng)完成, 所以這里是true, 默認(rèn)判斷條件if (firstRegistration)也為true, 所以這里會(huì)走到pipeline.fireChannelActive()這一步

有關(guān)pipeline我們會(huì)在下一章進(jìn)行詳細(xì)分析, 這里我們只需要知道, 最后會(huì)流轉(zhuǎn)到AbstractUnsafe的beginRead()方法

跟到beginRead()方法:

public final void beginRead() {
    assertEventLoop();
    if (!isActive()) {
        return;
    }
    try {
        doBeginRead();
    } catch (final Exception e) {
        //代碼省略
    }
}

這塊代碼同樣我們也不陌生, 因?yàn)槲覀兎治鯪ioServerSocketChannel也分析過了這一步

我們繼續(xù)跟到doBeginRead():

protected void doBeginRead() throws Exception {
    //拿到selectionKey
    final SelectionKey selectionKey = this.selectionKey;
    if (!selectionKey.isValid()) {
        return;
    }
    readPending = true;
    //獲得感興趣的事件
    final int interestOps = selectionKey.interestOps();
    //判斷是不是對(duì)任何事件都不監(jiān)聽
    if ((interestOps & readInterestOp) == 0) {
        //此條件成立
        //將之前的accept事件注冊(cè), readInterest代表可以讀取一個(gè)新連接的意思
        selectionKey.interestOps(interestOps | readInterestOp);
    }
}

這段代碼相信大家會(huì)比較熟悉, 因?yàn)槲覀兎?wù)端channel注冊(cè)完之后也走到了這里

因?yàn)槲覀冊(cè)趧?chuàng)建NioSocketChannel的時(shí)候初始化的是read事件, selectionKey是channel在注冊(cè)時(shí)候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)這一步, 會(huì)將當(dāng)前channel的讀事件注冊(cè)到selector中去

注冊(cè)完成之后, NioEventLoop就可以輪詢當(dāng)前channel的讀事件了

以上就是NioSocketChannel注冊(cè)監(jiān)聽事件的流程

章節(jié)小結(jié)

    本章學(xué)習(xí)了有關(guān)客戶端接入, NioSocketChannel的創(chuàng)建, 注冊(cè)等相關(guān)操作, 并且涉及到了上一小節(jié)剖析的eventLoop的相關(guān)邏輯, 同學(xué)們可以將相關(guān)的流程通過debug的方式走一遍以加深印象

以上就是Netty分布式源碼分析監(jiān)聽讀事件的詳細(xì)內(nèi)容,更多關(guān)于Netty分布式監(jiān)聽讀事件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中隊(duì)列Queue和Deque的區(qū)別與代碼實(shí)例

    Java中隊(duì)列Queue和Deque的區(qū)別與代碼實(shí)例

    學(xué)過數(shù)據(jù)結(jié)構(gòu)的,一定對(duì)隊(duì)列不陌生,java也實(shí)現(xiàn)了隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于Java中隊(duì)列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能,涉及java針對(duì)圖片的讀取、屬性修改等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData

    Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData

    這篇文章主要來和大家分享一個(gè)Java技巧,那就是利用RxJava打造可觀測數(shù)據(jù)RxLiveData,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-06-06
  • Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    Java 靜態(tài)數(shù)據(jù)初始化的示例代碼

    這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • Java File類常用方法與文件過濾器詳解

    Java File類常用方法與文件過濾器詳解

    Java File類以抽象的方式代表文件名和目錄路徑名。該類主要用于文件和目錄的創(chuàng)建、文件的查找和文件的刪除等。File對(duì)象代表磁盤中實(shí)際存在的文件和目錄。本篇文章我們來講解File類的常用方法與文件過濾器
    2022-04-04
  • Springcloud Config支持本地配置文件的方法示例

    Springcloud Config支持本地配置文件的方法示例

    這篇文章主要介紹了Springcloud Config支持本地配置文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案

    SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案

    這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java枚舉類型-Enum

    java枚舉類型-Enum

    本文詳細(xì)介紹了 Java1.5 引入的新特性枚舉中的關(guān)鍵字enum,運(yùn)用大量的代碼加以解釋,相信可以幫助到正在學(xué)習(xí)該知識(shí)的小伙伴,大家可以參考一下
    2021-08-08
  • MyBatis實(shí)現(xiàn)物理分頁的實(shí)例

    MyBatis實(shí)現(xiàn)物理分頁的實(shí)例

    這篇文章主要介紹了MyBatis實(shí)現(xiàn)物理分頁的實(shí)例,MyBatis使用RowBounds實(shí)現(xiàn)的分頁是邏輯分頁,有興趣的可以了解一下。
    2017-01-01
  • java設(shè)計(jì)模式--橋接模式詳解

    java設(shè)計(jì)模式--橋接模式詳解

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之橋接模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-07-07

最新評(píng)論