ActiveMQ 5.7.0 redeliveryPolicy not being applied

activemq-classic, java, jms, spring

Solution

I agree with Tim's answer: policies are defined on the underlying connection factory object. For your scenario, I think you'd need to define 2 seperate ActiveMQ connection factories with there own policy, then define a seperate Spring connection factory for each which is then used appropriately

Here's an example I've used on ActiveMQ v5.5 before:

<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>

Problem

I am using ActiveMQ 5.7.0 and trying to implement a redelivery policy. I have two queues that I need to set redelivery policies for. However in testing, it does not apply my policy. Instead of following the configuration below, it retries 7 times @ 1sec intervals (not what I specified). ``` <!-- 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> ``` I have two listeners defined and they are applying the queues as below: ``` <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> ```

Original source