【问题标题】:ActiveMQ Redelivery Policy - How does it work?ActiveMQ 重新交付策略 - 它是如何工作的?
【发布时间】:2015-06-23 17:41:42
【问题描述】:

谁能解释一下 ActiveMQ 重新交付策略的实际工作原理? 它是在客户端还是服务器端工作?

假设我有一个重新传递策略,最多可以在 10 分钟内重新传递一条消息,每次尝试之间的间隔为 30 分钟,那么失败的消息究竟在哪里?

假设现在消息失败,30分钟后需要重新发送,那么消息在哪里?

我看到同一消费者在 30 分钟后收到了消息。

我想知道 ActiveMQ 在哪里存储这条消息 30 分钟。

如果我关闭了消费者或者我的消费者崩溃了,30分钟后我还能恢复消息吗?

我浏览了这些 ActiveMQ 页面以了解重新交付政策,但没有找到任何信息:

http://activemq.apache.org/redelivery-policy.html http://activemq.apache.org/message-redelivery-and-dlq-handling.html

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    有两种类型的重新投递。典型的是绑定到 ConnectionFactory 客户端的重新传递策略。代理不知道此设置中的重新传递,因为它是由客户端处理的,并且消息实际上在客户端上等待重新传递。但是,由于客户端未提交(或确认)消息,因此代理不会删除它。因此,如果消息在 30 分钟后重新发送,但客户端应用程序在 10 分钟后关闭,则消息将重新显示在代理上。

    还可以通过插件进行代理方重新交付。在这种情况下,经纪人会处理重新交付。有利有弊,特别是您无法从客户端代码控制它 - 但代理管理员可以控制它。这意味着代理重新交付可以重新交付给不同的消费者,而客户端重新交付则不能。

    在本页底部阅读有关经纪人重新交付的更多信息: http://activemq.apache.org/message-redelivery-and-dlq-handling.html

    【讨论】:

    • 非常感谢。我测试了客户端崩溃的情况,发现测试消息没有丢失。
    • 在使用代理重新交付插件时,消息真的可以重新交付给不同的消费者吗?询问是因为找不到这样的参考资料。
    • @SumitJain 你根本不向消费者传递消息。消费者消费来自队列的消息。如果您的消费者已经离开并且新的消费者被加入队列,是的,消息将在那里,除非它已过期或达到最大重新传递次数,然后移动到 DLQ
    • @Rafael 错了,broker 在activemq 中将消息推送给消费者,请参阅activemq.apache.org/what-is-the-prefetch-limit-for.html 它说“为了有效利用网络资源,broker 使用'推送'模型向消费者发送消息。 ”。另外,我的问题是,如果消费者没有离开,但处理过程中只有一个错误,代理重新传递插件是否会将味精传递给不同的消费者?
    • 这很有趣......你是绝对正确的,预取使消息存在于客户端中,但在处理完成并且代理接收到 ACK 信号之前,永远不会从代理中实际删除消息队列,因为这会为潜在的消息丢失打开一个漏洞。但是您是对的,我的推理中缺少一些东西……会四处挖掘。谢谢。
    猜你喜欢
    • 2014-12-15
    • 2021-06-22
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2011-10-15
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多