はパラメーターを受け入れないため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);
}
}