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