我正在创建一个简单的聊天应用程序可以有多个用户和多个聊天室。每个聊天室可以容纳多个用户。服务器启动时建立rabbitMQ连接。当一个 …
让我解决几个误解......
我想要实现的是套接字连接何时死亡 用户,如果他错过了基于路由密钥的消息(具体到 用户),他应该能够在任何时候再次收到这些消息 他用不同的队列重新连接起来
您正在使用独占队列。 的 根据定义 强> ,当关联的连接和通道消失时,这些队列将被删除。删除队列时,这些队列中的消息将丢失。
我觉得这是可能的,因为如果消息可以保持交换 它没有在任何队列中确认。
这不是RabbitMQ的工作方式。交换用于路由消息,队列用于存储消息。
以下评论不正确:
如果user1和user2在不同的主机上,显然应该建立 不同的渠道。 'channel'就像连接一样,if 两个通道使用相同的队列,它们可以接收相同的消息。
在不同的主机上,可能在不同的进程中运行, user1 和 user2 将各自建立自己的联系和渠道。两个消费者会 的 决不 强> 从同一队列接收相同的消息。
user1
user2
回到原始问题,您需要将队列声明为 的 不 强> - 独占且持久,并以这样的方式命名它们:当您的应用程序重新连接时,应用程序连接到同一队列。这样,应用程序可以使用队列中保留的消息。
RabbitMQ可以通过多种方式为您删除未使用的队列 记录 。
<子> 注意: RabbitMQ团队监控 rabbitmq-users 邮件列表 并且有时只回答StackOverflow上的问题。 子>
rabbitmq-users
消费者应该使用确认来消费消息,如果消息被传递给消费者并且在消费者连接丢失之前未被确认,则RabbitMQ将重新发送消息。你可以从中获得更多细节 RabbitMQ doc 。
在您的情况下,当套接字连接断开时,您应该强制关闭通道,然后RabbitMQ将知道这些消息应该重新发送。
要确保在服务器重新启动时消息能够存活,请设置exchange'duper': ch.assertExchange(exchangeName, 'direct', { durable: false });
ch.assertExchange(exchangeName, 'direct', { durable: false });