我正在使用 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() 阻止等待回复。
我遇到的问题是 FooClientManager 在调用 channel.write() 的 API 的用户之前没有看到握手回复,因为从未执行过 read()。
如果我在调用 channel.write() 之前调用 reader.read(),它会无限期地阻塞,因为 FooClientManager 不会发送我试图读取管道的消息。
处理阻塞客户端 IO 和管道中可能消耗消息的通道处理程序的最佳方法是什么?