您好,登錄后才能下訂單哦!
小編給大家分享一下Netty分布式監(jiān)聽讀事件的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們回到AbstractUnsafe的register0()方法:
private void register0(ChannelPromise promise) { try { //省略代碼 //做實(shí)際的注冊 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()做完實(shí)際的注冊之后, 會走到if (isActive())這個(gè)判斷, 因?yàn)檫@個(gè)時(shí)候鏈路已經(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) { //代碼省略 } }
這塊代碼同樣我們也不陌生, 因?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(); //判斷是不是對任何事件都不監(jiān)聽 if ((interestOps & readInterestOp) == 0) { //此條件成立 //將之前的accept事件注冊, readInterest代表可以讀取一個(gè)新連接的意思 selectionKey.interestOps(interestOps | readInterestOp); } }
這段代碼相信大家會比較熟悉, 因?yàn)槲覀兎?wù)端channel注冊完之后也走到了這里
因?yàn)槲覀冊趧?chuàng)建NioSocketChannel的時(shí)候初始化的是read事件, selectionKey是channel在注冊時(shí)候返回的key, 所以selectionKey.interestOps(interestOps | readInterestOp)這一步, 會將當(dāng)前channel的讀事件注冊到selector中去
注冊完成之后, NioEventLoop就可以輪詢當(dāng)前channel的讀事件了
以上是“Netty分布式監(jiān)聽讀事件的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。