每个连接channel都会创建一个ChannelPipeline,它将多个ChannelHandler组装起来,当收发消息时,按一定顺序和规则将消息传播给各个ChannelHandler进行处理。
入站处理和出站处理
ChannelHandler分入站(ChannelInboundHandler)和出站(ChannelOutboundHandler),收到消息做入站处理,发出消息做出站处理。假如在ChannelPipeline中按顺序放入5个ChannelHandler,第1、3、5是入站,收到消息时按顺序触发。第2、4是出站。发出消息时会按逆向顺序触发。
出站是按逆向顺序,假如在入站3的时候就结束入站处理,并且发出消息触发出站,按逆向出站只能触发出站2,而不会触发4和5。只有在入站5发出消息触发出站,才会先后触发出站4和2。
ChannelPipeline操作
ChannelPipeline内的ChannelHandler数量或顺序都可以动态进行调整修改
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast("handler1",new Handler1());//1添加到结尾
ch.pipeline().addLast("handler2",new Handler2());//2添加到结尾
ch.pipeline().addfirst("handler3",new Handler3());//3添加到开头
ch.pipeline().remove("handler1");//移除1
ch.pipeline().replace("handler2","handler4",new Handler4());//4替代2
ch.pipeline().addBefore("handler3","handler5",new Handler5());//在3前面添加5
ch.pipeline().addAfter("handler3","handler6",new Handler6());//在3后面添加6