0

我有一个关于可以向 getPipeline() 提供什么类型的输入的问题...

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

如果可能的话,我希望这发生在 getPipeline() 本身。

4

1 回答 1

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);
    }
}
于 2012-12-27T04:38:14.093 回答