如何在队列上设置ActiveMQ重新交付策略?

如何在队列上设置ActiveMQ重新交付策略?,activemq,spring-jms,Activemq,Spring Jms,如何在队列上的ActiveMQ中设置redeliveryPolicy 1)在文档中,请参阅:,解释您应该在ConnectionFactory或Connection上设置它。但是我想对不同的队列使用不同的值 2)除此之外,我似乎没法让它工作。在Spring中的连接工厂(我使用activemq 5.4.2,Spring 3.0)上这样设置似乎没有任何效果: <amq:connectionFactory id="amqConnectionFactory" brokerURL="${jms.fac

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

1)在文档中,请参阅:,解释您应该在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>


谢谢

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

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

您可以在
amq
命名空间中设置
重新交付策略
,如下所示:


我也在使用上面Ivan为amq:connectionFactory所示的方法

在升级到ActiveMQ 5.7.0时,我注意到这不再有效(自的实现)。无论如何,在阅读了我目前使用的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.smsque”,并将消息放入该队列(从原始队列中退出队列)。

我无法获取ActiveMQ(5.7.0)当我在ConnectionFactory或队列上使用
定义我的重新交付策略时,识别我的重新交付策略(它一直使用默认的重新交付策略)。对我有效的是:

  • 创建作为独立bean的RedeliveryPolicy,然后Spring在ConnectionFactory中引用它
  • 创建一个显式DLQ,Spring在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" />


由于重新交付策略不是特定于目的地的,因此您需要使用不同的重新交付策略定义多个连接,然后使用不同的连接访问不同的目的地。如果您控制哪些消费者使用哪些连接(例如,在Spring配置中),这是非常容易做到的。如果客户机正在查找自己的连接,比如通过JNDI,那么您需要更加仔细地了解如何命名不同的连接以及建议客户使用哪些连接。现在,您可以按每个目的地配置重新送达策略。是否可以发布工作配置?这是否意味着当达到最大重试次数时,将在DLQ.emailQueue中放置邮件?我找不到任何关于确切目的地的文档。确实,在第一次达到最大重试次数时创建了一个新队列“DLQ.emailQueue”,消息从“emailQueue”移动到该队列。我看到他们带着微笑queue://DLQ.emailQueue,redelivered='false',在本例中,因为它失败了。redelivered对我有效,但DLQ无效,仍在activemq.DLQ上发布