2012-12-12 30 views
2

我正在使用ActiveMQ 5.7.0并尝试实施重新传递策略。我有两个队列需要设置重新送达政策。但是在测试中,它不适用于我的政策。不是按照下面的配置,而是在1秒间隔内重试7次(不是我指定的)。ActiveMQ 5.7.0 redeliveryPolicy未应用

<!-- ActiveMQ destinations to use --> 
    <amq:queue id="destinationOne" physicalName="${activemq.one.queuename}"> 
    <amq:properties> 
     <amq:redeliveryPolicy destination="One.DLQ" maximumRedeliveries="5" initialRedeliveryDelay="300000" useExponentialBackOff="true" backOffMultiplier="2" maximumRedeliveryDelay="3600000"/> 
    </amq:properties> 
    </amq:queue> 
    <amq:queue id="destinationTwo" physicalName="${activemq.two.queuename}"> 
    <amq:properties> 
     <amq:redeliveryPolicy destination="Two.DLQ" maximumRedeliveries="5" initialRedeliveryDelay="300000" useExponentialBackOff="true" backOffMultiplier="2" maximumRedeliveryDelay="3600000"/> 
    </amq:properties> 
    </amq:queue> 

我有两个听众定义,它们如下应用队列:

<bean id="oneMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="destination" ref="destinationOne"/> 
    <property name="messageListener" ref="jmsOneListener" /> 
    <property name="autoStartup" value="false" />  
    <property name="sessionTransacted" value="true"/> 
    <property name="concurrentConsumers" value="2" /> 
    </bean> 
    <bean id="twoMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="jmsConnectionFactory"/> 
    <property name="destination" ref="destinationTwo"/> 
    <property name="messageListener" ref="jmsTwoListener" /> 
    <property name="autoStartup" value="false" />  
    <property name="sessionTransacted" value="true"/> 
    <property name="concurrentConsumers" value="2" /> 
    </bean> 

回答

4

我同意Tim的回答:策略是在底层连接工厂对象上定义的。对于你的场景,我认为你需要定义2个独立的ActiveMQ连接工厂,并有自己的策略,然后为每个连接工厂定义一个独立的弹簧连接工厂,然后适当地使用它们。

这里是我在ActiveMQ v5上使用的一个例子0.5前:

<bean id="rawConnectionFactory1" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="${broker.url}" /> 
    <property name="redeliveryPolicy" ref="policy1" /> 
    <property name="useCompression" value="true" /> 
</bean> 
<bean id="rawConnectionFactory2" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="${broker.url}" /> 
    <property name="redeliveryPolicy" ref="policy2" /> 
    <property name="useCompression" value="true" /> 
</bean> 


<bean id="policy1" class="org.apache.activemq.RedeliveryPolicy"> 
    <property name="initialRedeliveryDelay" value="20000" /> 
    <property name="useExponentialBackOff" value="false" /> 
    <property name="useCollisionAvoidance" value="false" /> 
    <property name="maximumRedeliveries" value="0" /> 
</bean> 
<bean id="policy2" class="org.apache.activemq.RedeliveryPolicy"> 
    <property name="initialRedeliveryDelay" value="60000" /> 
    <property name="useExponentialBackOff" value="false" /> 
    <property name="useCollisionAvoidance" value="false" /> 
    <property name="maximumRedeliveries" value="5" /> 
</bean> 


<bean id="connectionFactory1" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="rawConnectionFactory1" /> 
    <property name="sessionCacheSize" value="30" /> 
</bean> 
<bean id="connectionFactory2" class="org.springframework.jms.connection.CachingConnectionFactory"> 
    <property name="targetConnectionFactory" ref="rawConnectionFactory2" /> 
    <property name="sessionCacheSize" value="10" /> 
</bean> 
+0

是的,谢谢你填写的细节。 –

3

重新传递政策实例经由ActiveMQConnectionFactory RedeliveryPolicy属性设置MessageConsumers设置。我不确定你的配置在做什么,但它看起来不正确。

2

多次重试后,我用的amq命名空间有一个工作版本:

<amq:connectionFactory brokerURL="..." id="connectionFactory"> 
    <amq:redeliveryPolicyMap> 
     <amq:redeliveryPolicyMap><!-- Don't know why a double nesting --> 
      <amq:defaultEntry> 
       <!-- default policy, 5 times with 10s delay each --> 
       <amq:redeliveryPolicy maximumRedeliveries="5" initialRedeliveryDelay="10000" /> 
      </amq:defaultEntry> 
      <amq:redeliveryPolicyEntries> 
       <!-- three times with exponential back-off, that is, 1s, 2s, 4s, 8s. "queue" references to the "physicalName" defined in amq:queue --> 
       <amq:redeliveryPolicy queue="queue.thread.autopay" maximumRedeliveries="3" initialRedeliveryDelay="1000" backOffMultiplier="2" useExponentialBackOff="true" /> 
       <!-- another policy mapping --> 
       <amq:redeliveryPolicy queue="queue.thread.doc" maximumRedeliveries="2" initialRedeliveryDelay="4000" /> 
      </amq:redeliveryPolicyEntries> 
     </amq:redeliveryPolicyMap> 
    </amq:redeliveryPolicyMap> 
</amq:connectionFactory> 
0

同周杰伦的答案,但有香草春天配置我的amq命名空间没有工作,当我使用属性我们ing ${}

<spring:bean name="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
     <spring:property name="brokerURL" value="${activemq.broker.url}"/> 
     <spring:property name="userName" value="${activemq.username}"/> 
     <spring:property name="password" value="${activemq.passwd}"/> 
     <spring:property name="redeliveryPolicyMap"> 
      <spring:bean id="redeliveryPolicyMap" class="org.apache.activemq.broker.region.policy.RedeliveryPolicyMap"> 
       <spring:property name="defaultEntry">     
       <spring:bean class="org.apache.activemq.RedeliveryPolicy"/> 
       </spring:property> 
       <spring:property name="redeliveryPolicyEntries"> 
        <spring:list> 
         <spring:bean class="org.apache.activemq.RedeliveryPolicy">   
          <spring:property name="maximumRedeliveries" value="${max.redelivery}"/> 
          <spring:property name="redeliveryDelay" value="${retry.delay}"/> 
          <spring:property name="initialRedeliveryDelay" value="${retry.delay.initial}"/> 
          <spring:property name="queue" value="${my.queue}"/> 
         </spring:bean> 
        </spring:list> 
       </spring:property> 
      </spring:bean> 
     </spring:property> 
    </spring:bean> 
相关问题