Netty channelHandler和channelPipeline。
channelPipeline将channelHandler链接起来做逻辑处理。
channelHandler有四个状态,在handler处理时可更具状态激活不同的方法,比如channelActive对应于channelActive(ChannelHandlerContext ctx , Object msg)方法。
channelHandler生命周期:
channleHandler有两个子接口,分别用来出站数据处理和入站数据处理的。channelInBoundHandler、channelOutBoundHandler。
Netty资源管理。
发
public class DiscardOutBoundHandler extends ChannelOutboundHandlerAdapter{
@Override
public void write(ChannelHandlerContext ctx , Object msg , ChannelPromise promise){
ReferenceCountUtil.release(msg);// 释放消息,不传向下一个handler。
promise.setSuccess();
}
}
Netty通过计数法的方式,统计资源,如果一个消息被消费或者被丢弃了,应该调用ReferenceCountUtil.release()释放掉这个资源。
channelPipeline:
channelHandlerContext在channelPipeLine中流动,channelHandler对context进行处理。
import static io.netty.channel.DummyChannelPipeline.DUMMY_INSTANCE;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelPipeline;
public class ModifyChannelPipeline {
private static final ChannelPipeline CHANNEL_PIPELINE_FROM_SOMEWHERE = DUMMY_INSTANCE;
public void modifyPipeline(){
ChannelPipeline channel = CHANNEL_PIPELINE_FROM_SOMEWHERE ;
channel.addLast("handler1" , new FirstChannel());
channel.addLast("handler2" , new SecondChannel());
channel.addLast("handler3" , new ThreadChannel());
channel.remove("handler3");
}
public static class FirstChannel extends ChannelHandlerAdapter{
}
public static class SecondChannel extends ChannelHandlerAdapter{
}
public static class ThreadChannel extends ChannelHandlerAdapter{
}
}
ChannelHandlerContext:
ChannelHandlerContext提供了channel和pipeline之间的连接,加入一个channelhandler,就会有一个channelhandlercontext与之对应。
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.DummyChannelPipeline;
import io.netty.util.CharsetUtil;
public class WriteHandlers {
private static final ChannelHandlerContext CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE = DUMMY_INSTANCE;
private static final ChannelPipeline CHANNEL_PIPELINE_FROM_SOMEWHERE = DummyChannelPipeline.DUMMY_INSTANCE;
/**
* 通过ChannelHandlerContext访问channel
*/
public void accessChannel(){
ChannelHandlerContext handlerContext = this.CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE;
Channel channel = handlerContext.channel();
channel.write(Unpooled.copiedBuffer("okkk" , CharsetUtil.UTF_8));
}
/**
* 通过channelHandlercontext访问channelPipeline。
*/
public void accessChannelPipeline(){
ChannelHandlerContext handlerContext = this.CHANNEL_HANDLER_CONTEXT_FROM_SOMEWHERE;
ChannelPipeline channelPipe = handlerContext.pipeline();
channelPipe.write(Unpooled.copiedBuffer("ok" , CharsetUtil.UTF_8));
}
}