2

OioClientSocketChannelFactory と次のようなパイプラインを使用してクライアント接続を設定しています。

ClientBootstrap bootstrap = new ClientBootstrap(
    new OioClientSocketChannelFactory(Executors.newCachedThreadPool())
);

pipeline.addLast("encoder", new MessageEncoder());
pipeline.addLast("decoder", new MessageDecoder());
pipeline.addLast("manager", new FooClientManager());
BlockingReadHandler<Message> reader = new BlockingReadHandler<Message>();
pipeline.addLast("reader", reader);
bootstrap.setPipeline(pipeline);

FooClientManager クラス (SimpleChannelHandler) は接続時にハンドシェイク メッセージを送信し (SimpleChannelHandler.channelConnected)、サーバーからのハンドシェイク応答 (SimpleChannelHandler.messageReceived) をパイプラインに渡さずに消費する責任があります。API のユーザーが特定の低レベルのメッセージを受信するのは望ましくありません。これは、FooClientManager が消費する責任です。

接続後、API のユーザーはメッセージを作成し、channel.write() を呼び出してメッセージを送信し、reader.read() を呼び出して応答待ちをブロックすることが予想されます。

私が抱えている問題は、read() が実行されなかったため、API のユーザーが channel.write() を呼び出す前に FooClientManager がハンドシェイク応答を確認できなかったことです。

channel.write() を呼び出す前に reader.read() を呼び出すと、FooClientManager がパイプラインを読み取ろうとしているメッセージを送信しないため、無期限にブロックされます。

メッセージを消費する可能性があるパイプラインでのクライアント IO とチャネル ハンドラのブロックに対処する最善の方法は何ですか?

4

2 に答える 2

1

FooClientManager は、ハンドシェイクが完了したときに API ユーザーに通知する必要があります。1 つのオプションは、API ユーザーに FooClientManager のコンストラクターに渡されるインターフェースを実装させることです。Future のように動作し、API ユーザーがハンドシェイクが完了するまでブロックできるようにする、このインターフェースのデフォルトの実装をいつでも作成できます。

もう 1 つのオプションは、接続の準備ができたことを知らせるカスタム メッセージを FooClientManager にパイプラインに送信させることです。API ユーザーは、メッセージを受信するまで、reader.read() をブロックします。

于 2012-07-12T13:24:37.713 に答える
0

答えてくれてありがとう

これらのソリューションは両方とも機能します。私たちが実装した解決策は、ハンドシェイクが完了するまで FooClientManager に書き込み要求をキューに入れることでした。次に、キューに入れられたすべてのメッセージを送信します。

私たちが遭遇した問題の 1 つは、ハンドシェイクが完了するまですべての書き込み要求をキューに入れている場合、FooClientManaager が channel.write() を呼び出すときにハンドシェイク メッセージ自体がキューに入れられ、メッセージがパイプライン全体を介して送信されることです。これを回避するには、FooClientManager でメッセージ イベントを作成し、それをパイプラインの次のハンドラーに直接送信します。

ctx.sendDownstream(new DownstreamMessageEvent(ctx.getChannel(), new DefaultChannelFuture(ctx.getChannel(), false), msg, e.getChannel().getRemoteAddress()));
于 2012-07-12T16:20:21.223 に答える