如何在队列上设置ActiveMQ redeliveryPolicy?

时间:2011-03-16 23:33:30

标签: activemq spring-jms

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

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

2)除此之外,我似乎没有让它发挥作用。在Spring中的连接工厂上设置它(我使用的是带有Spring 3.0的activemq 5.4.2。)似乎没有任何效果:

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

我还尝试将其设置为已定义的Queue上的属性,但这似乎也被忽略,因为重新发送的时间早于定义的值:

<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 个答案:

答案 0 :(得分: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并将该消息排入该队列(将其从原始队列中取出)。

答案 1 :(得分:5)

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

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

答案 2 :(得分: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>

答案 3 :(得分:1)

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

  • 将RedeliveryPolicy创建为独立bean,然后在ConnectionFactory中对其进行Spring引用
  • 在RedeliveryPolicy
  • 中创建显式DLQ并对其进行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" />