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)文章
springboot掃描引入jar包的service等組件方式
這篇文章主要介紹了springboot掃描引入jar包的service等組件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
淺談java中math類中三種取整函數(shù)的區(qū)別
下面小編就為大家?guī)硪黄獪\談java中math類中三種取整函數(shù)的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11
Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解
這篇文章主要介紹了Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06
Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無效問題
這篇文章主要介紹了Java并發(fā)編程service層處理并發(fā)事務(wù)加鎖可能會(huì)無效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

