Netty事件傳播詳解

在netty的pipeline中包含兩種類型的事件蜈敢,分別為inbound和outbound,inbound為上行事件,outbound為下行事件无蜂。inbound事件為被動觸發(fā),在某些情況發(fā)生時(shí)自動觸發(fā)蒙谓;outbound為主動觸發(fā)斥季,在需要主動執(zhí)行某些操作時(shí)觸發(fā)。
inbound事件一般通過pipeline的fire**方法觸發(fā)累驮,包含如下:
1.fireChannelRegistered
channel注冊事件酣倾,為inbound事件。

@Override
public final ChannelPipeline fireChannelRegistered() {
    AbstractChannelHandlerContext.invokeChannelRegistered(head);
    return this;
}

2.fireChannelUnregistered
channel解除注冊事件谤专,為inbound事件躁锡。

@Override
public final ChannelPipeline fireChannelUnregistered() {
    AbstractChannelHandlerContext.invokeChannelUnregistered(head);
    return this;
}

3.fireChannelActive
channel活躍事件,為inbound事件毒租。

@Override
public final ChannelPipeline fireChannelActive() {
    AbstractChannelHandlerContext.invokeChannelActive(head);
    return this;
}

4.fireChannelInactive
channel非活躍事件稚铣,為inbound事件。

@Override
public final ChannelPipeline fireChannelInactive() {
    AbstractChannelHandlerContext.invokeChannelInactive(head);
    return this;
}

5.fireExceptionCaught
異常事件墅垮,這個(gè)事件會在所有handler里傳播惕医。

@Override
public final ChannelPipeline fireExceptionCaught(Throwable cause) {
    AbstractChannelHandlerContext.invokeExceptionCaught(head, cause);
    return this;
}

6.fireUserEventTriggered
用戶事件,為inbound事件算色。

@Override
public final ChannelPipeline fireUserEventTriggered(Object event) {
    AbstractChannelHandlerContext.invokeUserEventTriggered(head, event);
    return this;
}

7.fireChannelRead
channel讀事件抬伺,為inbound事件。

@Override
public final ChannelPipeline fireChannelRead(Object msg) {
    AbstractChannelHandlerContext.invokeChannelRead(head, msg);
    return this;
}

8.fireChannelReadComplete
channel讀完成事件灾梦,為inbound事件峡钓。

@Override
public final ChannelPipeline fireChannelReadComplete() {
    AbstractChannelHandlerContext.invokeChannelReadComplete(head);
    return this;
}

9.fireChannelWritabilityChanged
channel寫狀態(tài)變化事件,為inbound事件若河。

@Override
public final ChannelPipeline fireChannelWritabilityChanged() {
    AbstractChannelHandlerContext.invokeChannelWritabilityChanged(head);
    return this;
}

在pipeline中通過fire觸發(fā)的事件都會調(diào)用AbstractChannelHandlerContext對應(yīng)的invoke方法能岩,而且都會執(zhí)行head的invoke方法,該方法會調(diào)用該context的handler的對應(yīng)處理方法萧福,然后調(diào)用該context的fire方法向后面的inbound context傳播拉鹃。

outbound事件包含如下:
1.bind
端口綁定事件。

@Override
public final ChannelFuture bind(SocketAddress localAddress) {    
             return tail.bind(localAddress);
}

2.connect
連接事件鲫忍。

@Override
public final ChannelFuture connect(SocketAddress remoteAddress) {
    return tail.connect(remoteAddress);
}

3.disconnect
斷開連接事件膏燕。

@Override
public final ChannelFuture disconnect() {
    return tail.disconnect();
}

4.close
關(guān)閉事件。

@Override
public final ChannelFuture close() {
    return tail.close();
}

5.deregister
解除注冊事件悟民。

@Override
public final ChannelFuture deregister() {
    return tail.deregister();
}

6.flush
刷新數(shù)據(jù)到網(wǎng)絡(luò)事件坝辫。

@Override
public final ChannelPipeline flush() {
    tail.flush();
    return this;
}

7.read
讀事件,在創(chuàng)建好NioSocketChannel后會觸發(fā)該事件射亏,用于注冊該channel的OP_READ感興趣事件到event loop的selector近忙。

@Override
public final ChannelPipeline read() {
    tail.read();
    return this;
}

8.write
寫事件竭业。

@Override
public final ChannelFuture write(Object msg) {
    return tail.write(msg);
}

9.writeAndFlush
寫出數(shù)據(jù)事件。

@Override
public final ChannelFuture writeAndFlush(Object msg) {
    return tail.writeAndFlush(msg);
}

outbound事件都會從pipeline的tail開始傳播及舍,從tail向head遍歷尋找outbound類型的context永品,執(zhí)行該context的handler的對應(yīng)處理方法。
注意:HeadContext既是ChannelInboundHandler也是ChannelOutboundHandler击纬,但HeadContext只是outbound類型context鼎姐,不是inbound類型context,在觸發(fā)inbound事件時(shí)更振,因?yàn)閺腍eadContext起先執(zhí)行其handler(對于HeadContext和TailContext炕桨,其handler就是它們自身)的方法再傳播,而其handler必須是ChannelInboundHandler類型肯腕,所以HeadContext的對應(yīng)handler的方法也會執(zhí)行献宫,這也是HeadContext的handler必須既是ChannelInboundHandler也是ChannelOutboundHandler的原因。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末实撒,一起剝皮案震驚了整個(gè)濱河市姊途,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌知态,老刑警劉巖捷兰,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異负敏,居然都是意外死亡贡茅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門其做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顶考,“玉大人,你說我怎么就攤上這事妖泄【匝兀” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵蹈胡,是天一觀的道長渊季。 經(jīng)常有香客問我,道長审残,這世上最難降的妖魔是什么梭域? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任斑举,我火速辦了婚禮搅轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘富玷。我一直安慰自己璧坟,他們只是感情好既穆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雀鹃,像睡著了一般幻工。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黎茎,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天囊颅,我揣著相機(jī)與錄音,去河邊找鬼傅瞻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凿菩。 我是一名探鬼主播婆廊,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溺森!你這毒婦竟也來了慕爬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤屏积,失蹤者是張志新(化名)和其女友劉穎医窿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炊林,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡留搔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铛铁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片隔显。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饵逐,靈堂內(nèi)的尸體忽然破棺而出括眠,到底是詐尸還是另有隱情,我是刑警寧澤倍权,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布掷豺,位于F島的核電站,受9級特大地震影響薄声,放射性物質(zhì)發(fā)生泄漏当船。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一默辨、第九天 我趴在偏房一處隱蔽的房頂上張望德频。 院中可真熱鬧,春花似錦缩幸、人聲如沸壹置。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钞护。三九已至盖喷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間难咕,已是汗流浹背课梳。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留余佃,地道東北人惦界。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像咙冗,于是被迫代替她去往敵國和親沾歪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容