【问题标题】:Message passing from rabbitmq channel to java NIO channel从 rabbitmq 通道传递到 java NIO 通道的消息
【发布时间】:2012-04-03 10:04:26
【问题描述】:

我正在为一个应用程序构建一个聊天组件(所有讨论都保存在其中),我计划有一个长轮询服务器作为客户端机器和 rabbitmq 服务器之间的接口,它将解析格式并将消息排入队列由 celery 处理的作业队列(在 rabbitmq 上),然后它将通过检查数据库中的某些信息等来检查是否允许发布,将消息保存到数据库,然后再次将它们排入 r​​abbitmq 中,这一次将由要推送到客户端机器的长轮询服务器。

我计划从rabbit服务器到长轮询服务器建立一个连接,包含许多通道,每个通道对应一个nio套接字通道,客户端机器在另一端监听。

长轮询服务器将使用 Java Nio 库编写。我的问题是,将消息从 AMQP 通道发送到套接字通道以推送给客户端的有效方法是什么?

根据我对 NIO 的理解,唯一一次应该为 OP_WRITE 注册选择键是在之前尝试的 write() 调用返回 0 时。不过,在这种情况下,我有兴趣在信息存在时写入套接字通道对应的 AMQP 通道。一旦数据进入其相应的 amqp 通道,如何提醒套接字通道,以便我可以通过套接字通道向客户端发送数据?

【问题讨论】:

    标签: comet rabbitmq nio


    【解决方案1】:

    只需调用 write()!无需“告诉” SocketChannel 任何东西。然后如果 write() 返回零,则执行 OP_WRITE 操作。

    【讨论】:

    • 那么我必须使用另一个线程,将每个 amqp 通道子类化以包含所有相应套接字通道的引用并调用 write?因为 amqp 通道与 nio 套接字通道是不同的对象:rabbitmq.com/releases/rabbitmq-java-client/v1.7.0/…
    • 根据我读过的内容,你应该只在从 socketrecv buf 读取一些内容(即有东西要写)之后调用 write() 。如果数据来自 amqp 通道,我什至如何在选择循环中提醒套接字通道?
    • 为了清楚起见,在这种情况下,长轮询服务器将充当消费者,从每个 amqp 通道对象接收消息,该对象对应于用户坐在另一端的特定 nio socketchannel .在 select 循环中,服务器充当生产者,接收用户发送的消息,正确格式化并通过 amqp 套接字将它们排入 r​​abbit。
    • @RoryBreaker 当你有东西要写的时候你写,这取决于你的应用程序协议,而不是套接字接收缓冲区。您不必“提醒套接字通道”。
    • 好的。如果我让每个 amqp ch 都持有对 nio socketchannel 的引用,我可以在数据进入后简单地尝试写入,如果它返回 0,只需将 socketchannel 设置为 OP_WRITE 并将未完成的数据保存在附件中下一个选择()。 socketchannel 可能在其他线程调用 write() 时正忙于读取,但是 socketchannel 支持并发读取和写入,对吗?我读过 NIO 有一个错误,该错误会阻止套接字通道上的并发读写;这仍然是一个问题吗(我拉出来的所有东西都很旧)?感谢您的回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2020-10-26
    • 2014-04-04
    • 2010-10-25
    相关资源
    最近更新 更多