我对可以为getPipeline()...
提供什么类型的输入有疑问我希望该方法为不同的ip地址返回不同的管道,基本上管道是相同的,但是每个阶段的一些处理程序使用的一些资源在给定客户端IP的情况下可能相同或不同。 例如。我想共享一个对象,该对象是基于IP输入到一个阶段(处理程序),相同的IP =相同的对象。
如果可能,我希望在getPipeline()本身发生这种情况。
答案 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);
}
}