Netty分布式源碼分析監(jiān)聽讀事件
前文傳送門:NioSocketChannel注冊到selector
我們回到AbstractUnsafe的register0()方法:
private void register0(ChannelPromise promise) { try { //省略代碼 //做實際的注冊 doRegister(); neverRegistered = false; registered = true; //觸發(fā)事件 pipeline.invokeHandlerAddedIfNeeded(); safeSetSuccess(promise); //觸發(fā)注冊成功事件 pipeline.fireChannelRegistered(); if (isActive()) { if (firstRegistration) { //傳播active事件(4) pipeline.fireChannelActive(); } else if (config().isAutoRead()) { beginRead(); } } } catch (Throwable t) { //省略代碼 } }
doRegister()做完實際的注冊之后, 會走到if (isActive())這個判斷, 因為這個時候鏈路已經(jīng)完成, 所以這里是true, 默認(rèn)判斷條件if (firstRegistration)也為true, 所以這里會走到pipeline.fireChannelActive()這一步
有關(guān)pipeline我們會在下一章進(jìn)行詳細(xì)分析, 這里我們只需要知道, 最后會流轉(zhuǎn)到AbstractUnsafe的beginRead()方法
跟到beginRead()方法:
public final void beginRead() { assertEventLoop(); if (!isActive()) { return; } try { doBeginRead(); } catch (final Exception e) { //代碼省略 } }
這塊代碼同樣我們也不陌生, 因為我們分析NioServerSocketChannel也分析過了這一步
我們繼續(xù)跟到doBeginRead():
protected void doBeginRead() throws Exception { //拿到selectionKey final SelectionKey selectionKey = this.selectionKey; if (!selectionKey.isValid()) { return; } readPending = true; //獲得感興趣的事件 final int interestOps = selectionKey.interestOps(); //判斷是不是對任何事件都不監(jiān)聽 if ((interestOps & readInterestOp) == 0) { //此條件成立 //將之前的accept事件注冊, readInterest代表可以讀取一個新連接的意思 selectionKey.interestOps(interestOps | readInterestOp); } }
這段代碼相信大家會比較熟悉, 因為我們服務(wù)端channel注冊完之后也走到了這里
因為我們在創(chuàng)建NioSocketChannel的時候初始化的是read事件, selectionKey是channel在注冊時候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)這一步, 會將當(dāng)前channel的讀事件注冊到selector中去
注冊完成之后, NioEventLoop就可以輪詢當(dāng)前channel的讀事件了
以上就是NioSocketChannel注冊監(jiān)聽事件的流程
章節(jié)小結(jié)
本章學(xué)習(xí)了有關(guān)客戶端接入, NioSocketChannel的創(chuàng)建, 注冊等相關(guān)操作, 并且涉及到了上一小節(jié)剖析的eventLoop的相關(guān)邏輯, 同學(xué)們可以將相關(guān)的流程通過debug的方式走一遍以加深印象
以上就是Netty分布式源碼分析監(jiān)聽讀事件的詳細(xì)內(nèi)容,更多關(guān)于Netty分布式監(jiān)聽讀事件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中隊列Queue和Deque的區(qū)別與代碼實例
學(xué)過數(shù)據(jù)結(jié)構(gòu)的,一定對隊列不陌生,java也實現(xiàn)了隊列,下面這篇文章主要給大家介紹了關(guān)于Java中隊列Queue和Deque區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-08-08Java實現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例
這篇文章主要介紹了Java實現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能,涉及java針對圖片的讀取、屬性修改等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Java技巧分享之利用RxJava打造可觀測數(shù)據(jù)RxLiveData
這篇文章主要來和大家分享一個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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02SpringBoot 2.6.x整合springfox 3.0報錯問題及解決方案
這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01