【问题标题】:How to set the ActiveMQ redeliveryPolicy on a queue?如何在队列上设置 ActiveMQ redeliveryPolicy?
【发布时间】:2014-09-25 06:28:49
【问题描述】:

如何在队列上的 ActiveMQ 中设置 redeliveryPolicy?

1) 在文档中,请参阅:activeMQ Redelivery,说明您应该在 ConnectionFactory 或 Connection 上设置它。但我想为不同的队列使用不同的值。

2) 除此之外,我似乎无法正常工作。像这样在 Spring 中的连接工厂上设置它(我正在使用 activemq 5.4.2. 和 Spring 3.0)似乎没有任何效果:

<amq:connectionFactory id="amqConnectionFactory" brokerURL="${jms.factory.url}" >
    <amq:properties>
        <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/>
    </amq:properties>
</amq:connectionFactory>

我也尝试将其设置为已定义队列的属性,但这似乎也被忽略了,因为重新传递发生得比定义的值早:

<amq:queue id="jmsQueueDeclarationSnd"  physicalName="${jms.queue.declaration.snd}" >
    <amq:properties>
        <amq:redeliveryPolicy maximumRedeliveries="6" initialRedeliveryDelay="15000" useExponentialBackOff="true" backOffMultiplier="5"/>
    </amq:properties>
</amq:queue>

谢谢

【问题讨论】:

  • 你能发布工作配置吗?

标签: activemq spring-jms


【解决方案1】:

我也使用上面 Ivan 显示的方法来处理 amq:connectionFactory

在升级到 ActiveMQ 5.7.0 时,我注意到这不再有效(因为实现了 https://issues.apache.org/jira/browse/AMQ-3224)。无论如何,在我目前使用的 ActiveMQ 论坛上阅读了一篇更好的帖子后:-

<amq:queue id="emailQueue" physicalName="emailQueue" />
<amq:queue id="smsQueue" physicalName="smsQueue" />

<!-- Wait 15 seconds first re-delivery, then 45, 135, 405, 1215, 3645 seconds -->
<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
    <property name="backOffMultiplier" value="3" />
    <property name="initialRedeliveryDelay" value="15000" />
    <property name="maximumRedeliveries" value="6" />
    <property name="queue" value="*" />
    <property name="redeliveryDelay" value="15000" />
    <property name="useExponentialBackOff" value="true" />
</bean>

<amq:connectionFactory id="jmsFactory" brokerURL="yourProtocol/BrokerURL">
    <property name="redeliveryPolicy" ref="redeliveryPolicy" />
</amq:connectionFactory>

请注意,对于重试 6 次后仍无法重新传递的任何消息,ActiveMQ 将创建一个 DLQ.emailQueue' 或 DLQ.smsQueue 并将消息排入该队列(将其从原始队列中取出)。

【讨论】:

  • 那么这是否意味着 DLQ.emailQueue 是当达到最大重试次数时将放置消息的位置?我找不到任何关于目的地到底是什么的文档。
  • 当然,在第一次达到最大重试次数时创建了一个新队列“DLQ.emailQueue”,并且消息从“emailQueue”移动到该队列。在这种情况下,我看到他们的目的地 = 'queue://DLQ.emailQueue', redelivered = 'false' 因为它失败了。
【解决方案2】:

我通过像上面那样在工厂上设置它来让它工作,但只有在将连接工厂创建为 Spring bean 而不是通过 XBean 时,如上所示。这是因为 xsd 不允许您将 redeliveryPolicy 设置为对象,而只能设置为字符串。 在 Spring 的 DefaultMessageListenerContainer 中将缓存级别设置为 Consumer 后,一切正常。

在队列上,您似乎可以简单地设置传递策略...奇怪,因为我想为不同的队列/主题设置不同的设置。试想一下,您有一个缓慢而快速的队列,或者您连接的外部系统需要更多时间来恢复。 也许这个功能还有待实现

【讨论】:

  • 由于重新投递策略并不特定于某个目的地,因此您需要使用不同的重新投递策略定义多个连接,然后使用不同的连接访问不同的目的地。如果您控制哪些消费者使用哪些连接,例如在 Spring 配置中,这很容易做到。如果客户端正在查找他们自己的连接,例如,通过 JNDI,那么您将需要更加细致地了解如何命名不同的连接以及建议客户端使用哪些连接。
  • As of ActiveMQ v5.7.0 您现在可以为每个目标配置 RedeliveryPolicy。
【解决方案3】:

您可以像这样在amq 命名空间中设置redeliveryPolicy

<amq:connectionFactory id="jmsRedeliverConnectionFactory" brokerURL="vm://localhost">
  <amq:redeliveryPolicy>
    <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="1000" useExponentialBackOff="true" backOffMultiplier="5" />
  </amq:redeliveryPolicy>
</amq:connectionFactory>

【讨论】:

    【解决方案4】:

    当我在 ConnectionFactory 或 Queue 上使用 &lt;amq:properties&gt; 定义我的重新交付策略时,我无法让 ActiveMQ (5.7.0) 识别它(它一直使用默认的重新交付策略)。对我有用的是:

    • 将 RedeliveryPolicy 创建为独立 bean,然后在 ConnectionFactory 中对其进行 Spring 引用
    • 创建显式 DLQ 并在 RedeliveryPolicy 中对其进行 Spring 引用

    Spring 配置如下:

    <amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost" redeliveryPolicy="#activeMQRedeliveryPolicy" />
    
    <amq:redeliveryPolicy id="activeMQRedeliveryPolicy" destination="#myDLQ" useExponentialBackOff="true" backOffMultiplier="3" maximumRedeliveries="4" />
    
    <amq:queue id="myDLQ" physicalName="DLQ.myDLQ" />
    

    【讨论】:

    • 重新投递对我有用,但 DLQ 不行,仍在 activemq.DLQ 上发帖
    猜你喜欢
    • 2019-03-27
    • 2018-11-25
    • 2011-12-27
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2021-08-09
    相关资源
    最近更新 更多