Netty源码分析之-ChannelPipeline
2018-07-13 本文已影响0人
高级Java开发
ChannelPipeline
image.pngChannelPipeline是Channel的负责组织ChannelHandler的组件,如上图所示,想象远端为上方,最上面为head,近端为我们的程序,最下面为tail。一个inbound事件,通常为读到的消息、用户自定义事件等会从上而下经过各个ChannelInboundHandler。而Outbound事件通常为write消息等,会经过ChannelOutboundHandler处理。
如果要在程序中发起一个事件,可以通过ChannelHandlerContext,ChannelHandlerContext的方法和Channel方法的区别是ChannelHandlerContext的事件会传递给下一个ChannelHandler来处理,而Channel发出的事件会从头ChannelHandler(head或tail)开始处理。ChannelPipeline类似Servlet中的Filter,或其他的Interceptor模式。
Inbound事件传播方法:
- ChannelHandlerContext#fireChannelRegistered()
- ChannelHandlerContext#fireChannelActive()
- ChannelHandlerContext#fireChannelRead(Object)
- ChannelHandlerContext#fireChannelReadComplete()
- ChannelHandlerContext#fireExceptionCaught(Throwable)
- ChannelHandlerContext#fireChannelUserEventTriggered(Object)
- ChannelHandlerContext#fireChannelChannelInactive()
- ChannelHandlerContext#fireChannelChannelUnRegistered()
- ChannelHandlerContext#fireChannelChannelWritabilityChanged()
Outbound事件传播方法包括 - ChannelHandlerContext#bind(SocketAddress, ChannelPromise)
- ChannelHandlerContext#connect(SocketAddress, SocketAddress, ChannelPromise)
- ChannelHandlerContext#write(Object, ChannelPromise)
- ChannelHandlerContext#flush()
- ChannelHandlerContext#read() //
- ChannelHandlerContext#close(ChannelPromise)
- ChannelHandlerContext#disconnect(ChannelPromise)
- ChannelHandlerContext#deregister(SocketAddress, ChannelPromise)
ChannelPipeline上的ChannelHandler通常分为以下几类
- Protocol Decoder - 将二进制数据转换为Java对象或将一种Java对象转换为另一种Java对象
- Protocol Encoder - 将Java对象转换成二进制数据或将一种Java对象转换为另一种Java对象
- 业务逻辑Handler - 针对不同的事件做出业务逻辑
ChannelPipeline最常用的方法就是在pipeline最后添加ChannelHandler了
ChannelPipeline addLast(ChannelHandler... handlers);
除此之外,pipeline是线程安全的,还能动态地添加删除ChannelHandler。
另外pipeline也包括了firestChannelxxx方法
@Override
ChannelPipeline fireChannelRegistered();
@Override
ChannelPipeline fireChannelUnregistered();
@Override
ChannelPipeline fireChannelActive();
@Override
ChannelPipeline fireChannelInactive();
@Override
ChannelPipeline fireExceptionCaught(Throwable cause);
@Override
ChannelPipeline fireUserEventTriggered(Object event);
@Override
ChannelPipeline fireChannelRead(Object msg);
@Override
ChannelPipeline fireChannelReadComplete();
@Override
ChannelPipeline fireChannelWritabilityChanged();
@Override
ChannelPipeline flush();
ChannelPipeline实现-DefaultChannelPipeline
很自然的我们可以想到使用双向链表来实现pipeline。