【Netty】ChannelHandler和ChannelPipeline
一、前言
前面学习了Netty的ByteBuf,接着学习ChannelHandler和ChannelPipeline。
二、ChannelHandler和ChannelPipeline
2.1 ChannelHandler
在ChannelPipeline中,ChannelHandler可以被链在一起处理用户逻辑。
1. Channel生命周期
Channel接口定义了一个简单但是强大的状态模型,该模型与ChannelInboundHandler API紧密联系,Channel有如下四种状态。
Channel的生命周期如下图所示。
当状态发生变化时,就会产生相应的事件。
2. ChannelHandler的生命周期
ChannelHandler定义的生命周期如下图所示。
Netty定义了ChannelHandler的两个重要的子类
· ChannelInboundHandler,处理各种入站的数据和状态的变化。
· ChannelOutboundHandler,处理出站数据并允许拦截的所有操作。
3. ChannelInboundHandler接口
下图展示了ChannelInboundHandler接口生命周期中的方法,当接受到数据或者其对应的Channel的状态发生变化则会调用方法
当ChannelInboundHandler的实现覆盖channelRead()方法时,它负责显式释放与池的ByteBuf实例相关联的内存,可以使用ReferenceCountUtil.release() 方法进行释放。如下代码展示了该方法的使用。
复制代码
public class DiscardHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ReferenceCountUtil.release(msg);
}
}
复制代码
上述显式的释放内存空间会显得比较麻烦,而如下代码则无需显式释放内存空间。
复制代码
@Sharable
public class SimpleDiscardHandler
extends SimpleChannelInboundHandler