Reputation: 19848
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>
Upvotes: 3
Views: 4132
Reputation: 12054
Same as Jay's Answer but with vanilla spring configuration as amq namespace didnt work for me when i use properties using ${}
<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>
Upvotes: 2
Reputation: 326
After several retries, I got a working version using amq namespace:
<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>
Upvotes: 3
Reputation: 1645
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>
Upvotes: 4
Reputation: 18356
Redelivery policy instances are set on MessageConsumers via the ActiveMQConnectionFactory RedeliveryPolicy property settings. I'm not really sure from the snippets what you're config is doing but it doesn't look right.
Upvotes: 3