ChannelPileline将ChannelHandler串联起来,形成一个处理逻辑。而ChannelhandlerContext管理上下文关系。
ChannelHandler 和 ChannelPipeline
Netty的channel生命周期是ChannelRegistered,ChannelActive,ChannelInactive,ChannelUnregistered。 一个ChannelHandler可以被添加和移除ChannelPipeline,而Context作为参数传入。
Netty定义了下面个重要的ChannelHandler:
- ChannelInboundHandler:处理入站数据及各种变化
- ChannelOutboundHandler:处理出站数据及各种变化
- ChannelHandler适配器:分别提供了上俩类的基本实现,通过扩展类ChannelHandlerAdapter,获得了共同超接口 ChannelHandler方法。
ChannelInboundHandler
当ChannelInboundHandler的实现重写channelRead()方法,他将负责显示地释放ByteBuf实例相关的内 。Netty为此提供了一个实用方 ReferenceCountUtil.release(),如下:
@Sharable
public class DiscardHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ReferenceCountUtil.release(msg);
}
}
但显示释放还是有些繁琐,如果没释放,需要通过WARN日志检查,SimpleChannelInboundHandler则会自动释放资源,如果存储对资源的引用,将会失效。
ChannelOutboundHandler
ChannelOutboundHandler一个强大的功能是可以按需推迟操作或者事件。它的大部分方法都需要一个 ChannelPromise参数,以便在完成时通知。ChannelPromise是ChannelFuture的一个子类,其定义了一些可写的方法,如setSuccess()和setFailure(), 从而使ChannelFuture可变。
不管是入站还是出站,消息被消费或者丢弃,需要传递给下一个handler,否则用户有责任主动释放。如果一直传递到传输层,Channel关闭时,都将被自动释放。
ChannelPipeline
ChannelPipeline 好比是ChannelHandler的一个链。 一个新创建的Channel将会被分到一个新的 ChannelPipeline,关联是永久性的,Channel不能附加外一个ChannelPipeline, 也不能分分离它。
ChannelHandlerContext使得ChannelHandler能够和它的ChannelPipeline以及其他的ChannelHandler交互。 ChannelHandler可以通知其属下的ChannelPipeline的下一个ChannelHandler, 甚至可以动态改变它所属的Pipeline。
参考列表:
- http://remcarpediem.com/2017/03/22/Netty%E6%BA%90%E7%A0%81-%E4%B8%80-Netty%E4%B8%AD%E7%9A%84Buffer/
- http://yihongwei.com/2014/01/netty-4-x-channel-pipeline/
- http://www.jianshu.com/u/4fdc8c2315e8
- http://www.infoq.com/cn/articles/netty-threading-model
- http://remcarpediem.com/2017/03/27/Netty%E6%BA%90%E7%A0%81-%E4%BA%8C-Netty%E7%9A%84Channel%E5%92%8CPipeline/