如何在队列上设置ActiveMQ redeliveryPolicy?

edb*_*ras 13 activemq-classic spring-jms

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

1)在doc中,请参阅:activeMQ Redelivery,解释您应该在ConnectionFactory或Connection上设置它.但我想为不同的Queue使用不同的值.

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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

谢谢

Way*_*haw 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>
Run Code Online (Sandbox Code Playgroud)

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


edb*_*ras 6

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

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

  • [从ActiveMQ v5.7.0开始](http://activemq.apache.org/redelivery-policy.html)您现在可以基于每个目标配置RedeliveryPolicy. (3认同)
  • 由于重新传递策略不是特定于目标,因此您需要使用不同的重新传递策略定义多个连接,然后使用不同的连接来访问不同的目标.如果您控制哪些消费者使用哪些连接(例如,在Spring配置中),这很容易做到.如果客户通过JNDI查找自己的连接,那么您需要更加细致地了解如何命名不同的连接以及建议客户使用哪些连接. (2认同)