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 に答える