没有连接的AMQP/RabbitMQ频道何时死亡?

没有连接的AMQP/RabbitMQ频道何时死亡?

问题描述:

我有一个简单的RabbitMQ测试程序随机排队消息,另一个读取它们,全部使用Spring-AMQP。如果消费者死亡(例如,在没有机会关闭其连接或通道的情况下杀死一个进程),则任何未被确认的消息似乎永远都不会被确认。没有连接的AMQP/RabbitMQ频道何时死亡?

我见过很多参考文献(例如this question),表示通道在没有连接的情况下死亡,剩余的未被删除的消息将被重新发送。这不是我看到的行为 - 相反,我获得了越来越多的标记为IDLE的频道列表,以及越来越多的标记为正在运行但没有活动的连接列表。

是否有一些配置需要注意,一旦进程被终止,连接已经死亡?

编辑: 我在一个VirtualBox虚拟机内运行rabbitmq服务器,这显然不能通过NAT正确管理死入站连接。这对于直接在物理主机上运行的mq服务器来说很好。

+1

FYI:我在这里独家队列没有被清理的经纪人及时专属消费死后类似的问题。这阻止了具有确定性名称的这些组件从开始。它是由ConnectionFactory.RequestedHeartbeat''设置为较小的值(秒) – drstevens

应答关闭。事实证明这不是一个真正的问题。

我运行一个虚拟机VirtualBox的,这显然不正常了NAT管理死入站连接内的RabbitMQ服务器。这对于直接在物理主机上运行的mq服务器来说很好。

AMQP使用队列和交换。你在交换机上发布并且绑定队列以从交易所获得消息(你可以在我的博客上看到short explanation。当你创建一个队列时,你可以将它设置为自动删除,以及在自动删除之前它会保留多少时间。删除 下面是来自RabbitMQ的quickref报价:

queue.declare(短保留-1,队列名队列,有点被动,位 耐用,有点​​排斥,位自动删除,NO-等待不等待,表 自变量)➔declare-ok

支持:full声明队列,如果需要创建

此方法创建或检查队列。创建新队列时,客户端可以指定各种属性,以控制队列及其内容的持久性,以及队列的共享级别。

RabbitMQ实现了AMQP规范的扩展,允许队列的创建者 控制其行为的各个方面。

每队列消息TTL该扩展确定发布到队列的消息在被服务器丢弃之前可以存活多长时间。 使用此方法的参数 参数的x-message-ttl参数配置生存时间。

队列到期队列可以声明一个可选的租约时间。租约时间决定了在服务器自动删除 之前,队列可以保持未使用状态的时间。在该方法的参数参数中提供的租约时间为 x-expires参数。

镜像队列我们已经为 队列开发了主动/主动高可用性。这可以通过允许队列在RabbitMQ集群中的其他节点 上镜像来工作。结果是,如果群集的一个节点发生故障,则队列可以自动切换到其中一个镜像 并继续运行,而不会无法使用服务。要创建镜像队列 ,您需要在此方法的参数 参数中提供x-ha-policy参数。

+0

我不想队列被删除解决了,我希望它是持久的。但我也希望未确认的消息(由确认前死亡的进程消耗)被重新传递。这是需要删除的死连接/通道,而不是消息。 –

+2

OK现在我把你 - 你需要创建ConnectionParameters实例和心跳(setRequestedHeardbeat)设置一个合理的值(1个心跳丢失将关闭该通道),然后传递给ConnectionFactory的构造 –

+0

@Arnon Rotem公司-Gal一盎司,创下'RequestedHeartbeat'解决了我这是在不能及时被清理的经纪人独家队列表现类似的问题。这阻止了从具有确定性名称的独占队列开始的组件。 – drstevens