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 とチャネル ハンドラのブロックに対処する最善の方法は何ですか?