Netty ChannelPipelinefactory getPipeline()输入参数

时间:2012-12-27 00:31:53

标签: netty

我对可以为getPipeline()...

提供什么类型的输入有疑问

我希望该方法为不同的ip地址返回不同的管道,基本上管道是相同的,但是每个阶段的一些处理程序使用的一些资源在给定客户端IP的情况下可能相同或不同。 例如。我想共享一个对象,该对象是基于IP输入到一个阶段(处理程序),相同的IP =相同的对象。

如果可能,我希望在getPipeline()本身发生这种情况。

1 个答案:

答案 0 :(得分:1)

由于ChannelPipelineFactory.getPipeline()不接受任何参数,因此ChannelPipelineFactory无法执行您想要的操作。

相反,我建议你让ChannelPipelineFactory.getPipeline()返回一个新的管道,其中包含一个设置管道的处理程序。也就是说,通道将以具有单个处理程序的管道开始,并且单个处理程序的channelConnected()可以将实际处理程序附加到管道并自行删除。

以下是一个例子:

public class MyChannelPipelineFactory implements ChannelPipelineFactory {
    public ChannelPipeline getPipeline() {
        return Channels.pipeline(new MyChannelInitializer());
    }
}

public class MyChannelInitializer extends SimpleChannelUpstreamHandler {
    public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent evt) {
        Channel ch = ctx.getChannel();
        ChannelPipeline p = ch.getPipeline();
        if (matchesA(ch.getRemoteAddress()) { // Protocol A
            p.addLast("A.decoder", new DecoderA());
            p.addLast("A.encoder", new EncoderA());
        } else { // Protocol B
            p.addLast("ssl", new SslHandler(...));
            p.addLast("B.decoder", new DecoderB());
            p.addLast("B.encoder", new EncoderB());
        }
        p.addLast("commonLogic", new CommonLogicHandler());
        p.remove(this);
        ctx.sendUpstream(evt);
    }
}