我有一个简单的RabbitMQ测试程序随机排队消息,另一个读取它们,都使用Spring-AMQP。如果消费者死亡(例如,在没有机会关闭其连接或通道的情况下终止进程),那么它未被确认的任何消息似乎永远不会被确认。
我已经看到许多引用(例如this question)表示当通道在没有连接时死亡,并且将重新传递剩余的未包装的消息。这不是我看到的行为 - 相反,我得到了一个越来越多的标记为IDLE的频道列表,以及越来越多的标记正在运行但没有活动的连接列表。
一旦进程被杀死,是否需要一些配置才能注意到连接已经死亡?
修改 我在VirtualBox VM中运行rabbitmq服务器,显然无法通过NAT正确管理死入站连接。这对于直接在物理主机上运行的mq服务器来说效果很好。
答案 0 :(得分:4)
AMQP使用队列和交换。您在交换机上发布并绑定队列以从交换机获取消息(您可以在我的博客上看到short explanation。当您创建队列时,您可以将其设置为自动删除以及它将保留多长时间在自动删除之前未使用。 以下是RabbitMQ quickref的引用:
queue.declare(短保留-1,队列名队列,位被动,位 持久,位独占,位自动删除,无等待无等待,表 参数)➔signre-ok
支持:完整声明队列,根据需要创建。
此方法创建或检查队列。在创建新队列时 客户端可以指定控制其持久性的各种属性 队列及其内容,以及队列的共享级别。
RabbitMQ实现了允许的AMQP规范的扩展 队列的创建者,以控制其行为的各个方面。
每队列消息TTL此扩展名确定消息的持续时间 发布到队列之前,服务器可以将其丢弃。 使用x-message-ttl参数配置生存时间 这个方法的参数参数。
队列到期可以使用可选的租约时间声明队列。该 租约时间决定了队列在此之前可以保持未使用的时间 由服务器自动删除。租赁时间以a为单位提供 x-expires参数在此方法的arguments参数中。
镜像队列我们已经开发了主动/主动高可用性 队列。这可以通过允许队列在其他节点上进行镜像来实现 在RabbitMQ集群中。结果是应该是一个节点 群集失败后,队列可以自动切换到其中一个镜像 并继续运营,没有无法提供的服务。创造 镜像队列,您在参数中提供x-ha-policy参数 此方法的参数。
答案 1 :(得分:3)
回答关闭。事实证明这不是一个真正的问题。
我在VirtualBox VM中运行rabbitmq服务器,显然无法通过NAT正确管理死入站连接。这对于直接在物理主机上运行的mq服务器来说效果很好。