Netty之通道生命周期
Netty通道的生命周期学习记录
ChannelInboundHandler入站生命周期
为了研究入站的生命周期,我们搞一个小demo。定义入站处理器InboundHandlerDemo,这个类继承ChannelInboundHandlerAdapter。将这个处理器添加到通道pipeline中。
public class InboundHandlerDemo extends ChannelInboundHandlerAdapter
{@Overridepublic void handlerAdded(ChannelHandlerContext ctx)…{Logger.info("被调用:handlerAdded()");super.handlerAdded(ctx);}@Overridepublic void channelRegistered(ChannelHandlerContext ctx)…{Logger.info("被调用:channelRegistered()");super.channelRegistered(ctx);}@Overridepublic void channelActive(ChannelHandlerContext ctx)…{Logger.info("被调用:channelActive()");super.channelActive(ctx);}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object
msg)…{Logger.info("被调用:channelRead()");super.channelRead(ctx, msg);}@Overridepublic void channelReadComplete(ChannelHandlerContext ctx)…
{Logger.info("被调用:channelReadComplete()");super.channelReadComplete(ctx);}@Overridepublic void channelInactive(ChannelHandlerContext ctx)…{Logger.info("被调用:channelInactive()");super.channelInactive(ctx);}@Overridepublic void channelUnregistered(ChannelHandlerContext ctx)…
{Logger.info("被调用: channelUnregistered()");super.channelUnregistered(ctx);}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx)…{Logger.info("被调用:handlerRemoved()");super.handlerRemoved(ctx);}
}
我们通过EmbeddedChannel嵌入式通道测试。
public class InboundHandlerDemoTest {@Testpublic void testInHandlerLifeCircle() {final InboundHandlerDemo handler= new InboundHandlerDemo ();//初始化处理器ChannelInitializer i = new ChannelInitializer<EmbeddedChannel>() {protected void initChannel(EmbeddedChannel ch) {ch.pipeline().addLast(handler);}};//创建嵌入式通道EmbeddedChannel channel = new EmbeddedChannel(i);ByteBuf buf = Unpooled.buffer();buf.writeInt(1);//模拟入站,向嵌入式通道写一个入站数据包channel.writeInbound(buf);channel.flush();//模拟入站,再写一个入站数据包channel.writeInbound(buf);channel.flush();//通道关闭channel.close();}
}
输出结果,如下:handlerAdded()→channelRegistered()→channelActive()→数据传输的入站回调(channelRead()→channelReadComplete())→channelInactive()→channelUnregistered()→handlerRemoved()
// 当业务处理器被加入到pipeline后,此方法将被回调。也就是在ch.pipeline().addLast(handler)
[main|handlerAdded]:被调用:handlerAdded()// 当通道成功绑定一个NioEventLoop反应器后。
[main|channelRegistered]:被调用:channelRegistered()// 当通道激活成功后。激活成功是指所有的业务处理器添加成功,注册的异步任务完成,并且与NioEventLoop反应器绑定的异步任务完成。
[main|channelActive]:被调用:channelActive()[main|channelRead]:被调用:channelRead()
[main|channelReadComplete]:被调用:channelReadComplete()
[main|channelRead]:被调用:channelRead()
[main|channelReadComplete]:被调用:channelReadComplete()// 当前通道的底层来连接已经不是ESTABLISH状态或者底层连接已经关闭时,会首先回调所有业务处理的ChannelInactive方法。
[main|channelInactive]:被调用:channelInactive()//当前通道和NioEventLoop反应器解除绑定,移除掉对这条通道的事件处理之后,回调所有业务处理器的
channelUnregistered ()方法
[main|channelUnregistered]:被调用: channelUnregistered()// netty会移除掉通道上所有的业务处理器,并且回调所有业务处理器的handlerRemoved方法。
[main|handlerRemoved]:被调用:handlerRemoved()