2012-03-18 40 views
0

我建立一个聊天组件(其中,所有讨论都保存),用于在应用程序和予计划有一个长轮询服务器作为客户机和所述的RabbitMQ服务器之间的接口,它将解析格式并将消息排入队列中的消息(在rabbitmq上),由芹菜处理,然后芹菜会检查是否允许通过检查数据库获取某些信息等,将消息保存到数据库中,并将它们排入rabbitmq,这次被long-polling服务器使用,被推送到客户端机器。消息从RabbitMQ的信道传递到Java NIO通道

我计划有从兔服务器向长轮询服务器的一个连接,包含许多信道,将各自对应于NIO套接字通道,其中一个客户端计算机正在侦听在另一端。

长轮询服务器将使用Java仁王库来写。我的问题是,将消息从AMQP通道发送到套接字通道并将其推送到客户端的有效方式是什么?

从我NIO的理解,一个SelectionKey的应登记OP_WRITE唯一的一次,就是当先前尝试write()调用返回0。在这种情况下,虽然,我很感兴趣,写入的SocketChannel当信息出现在相应的AMQP频道上。一旦数据进入其相应的amqp通道后,我怎么能通知套接字通道,以便我可以通过套接字通道将数据发送到客户端?

回答

1

只需调用write()!不需要'告诉'SocketChannel什么。然后,如果write()返回零,请执行OP_WRITE。

+0

然后我不得不使用另一个线程,每个子类的AMQP渠道,包含其所有对应的插座通道的参考,并调用写?由于AMQP渠道是不同的对象比NIO套接字通道:http://www.rabbitmq.com/releases/rabbitmq-java-client/v1.7.0/rabbitmq-java-client-javadoc-1.7.0/com/rabbitmq/ client/impl/ChannelN.html – Jaigus 2012-03-19 04:39:18

+0

根据我读过的内容,你应该在从socketrecv buf读取一些东西(即写东西)后才能调用write()。如果数据来自amqp通道,我怎么会在select循环中提醒socketchannel? – Jaigus 2012-03-19 04:48:59

+0

为了清楚起见,在这种情况下,长轮询服务器将充当消费者,从每个amqp通道对象接收对应于用户坐在另一端的特定nio套接字通道的消息。在选择循环中,服务器充当生产者,从用户发送消息,正确格式化并通过amqp套接字将它们排入兔子。 – Jaigus 2012-03-19 05:06:20