Netty实战-ChannelHandler

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/

CONTENTS