我设立使用OioClientSocketChannelFactory和 管道这样的客户端连接:Netty的阻断客户端
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在API的用户名为channel.write()之前没有看到握手应答,因为从未执行过read()。
如果我在调用channel.write()之前调用reader.read(),它将无限期地阻塞,因为FooClientManager不会发送消息,我试图读取管道。
处理阻塞客户端IO和管道中可能消费消息的通道处理程序的最佳方法是什么?
我很高兴您找到了解决方案。另一个提示是,你也可以使用org.jboss.netty.channel.Channels.write(...)直接向管道中的下一个处理程序写入消息。 – johnstlr 2012-07-13 08:02:42