14

如何在队列上的 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>

谢谢

4

4 回答 4

8

我也使用上面 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 并将消息排入该队列(将其从原始队列中取出)。

于 2012-10-29T04:58:22.670 回答
6

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

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

于 2011-03-17T13:13:04.220 回答
3

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

<amq:connectionFactory id="jmsRedeliverConnectionFactory" brokerURL="vm://localhost">
  <amq:redeliveryPolicy>
    <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="1000" useExponentialBackOff="true" backOffMultiplier="5" />
  </amq:redeliveryPolicy>
</amq:connectionFactory>
于 2012-05-16T09:50:02.077 回答
2

当我在 ConnectionFactory 或 Queue 上使用它定义它时,我无法让 ActiveMQ (5.7.0) 识别我的重新传递策略<amq:properties>(它一直使用默认的重新传递策略)。对我有用的是:

  • 将 RedeliveryPolicy 创建为独立 bean,然后在 ConnectionFactory 中对其进行 Spring 引用
  • 创建一个显式 DLQ 并在 RedeliveryPolicy 中对其进行 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" />
于 2013-01-30T19:36:39.033 回答