Netty分布式源碼分析監(jiā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í)例
學(xué)過數(shù)據(jù)結(jié)構(gòu)的,一定對(duì)隊(duì)列不陌生,java也實(shí)現(xiàn)了隊(duì)列,下面這篇文章主要給大家介紹了關(guān)于Java中隊(duì)列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能,涉及java針對(duì)圖片的讀取、屬性修改等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData
這篇文章主要來和大家分享一個(gè)Java技巧,那就是利用RxJava打造可觀測數(shù)據(jù)RxLiveData,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-06-06Java 靜態(tài)數(shù)據(jù)初始化的示例代碼
這篇文章主要介紹了Java 靜態(tài)數(shù)據(jù)初始化的示例代碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下2020-09-09Springcloud Config支持本地配置文件的方法示例
這篇文章主要介紹了Springcloud Config支持本地配置文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案
這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01MyBatis實(shí)現(xiàn)物理分頁的實(shí)例
這篇文章主要介紹了MyBatis實(shí)現(xiàn)物理分頁的實(shí)例,MyBatis使用RowBounds實(shí)現(xiàn)的分頁是邏輯分頁,有興趣的可以了解一下。2017-01-01