在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的原因。