How to enable RedeliveryDelay for ActiveMQ in Mule XA transactions -
i have simple flow in mule, listens activemq queue , if message queue contains string "fail" exception thrown. without xa transaction, works ok. message redelivered after 5 seconds, next time after seconds more. after 5 redeliveries message moved dead letter queue.
with xa transactions message redelivered 5 times , moved dead letter queue. how can tell mule or activemq wait redeliverydelay?
<?xml version="1.0" encoding="utf-8"?> <mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting" xmlns:jbossts="http://www.mulesoft.org/schema/mule/jbossts" xmlns:jms="http://www.mulesoft.org/schema/mule/jms" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="ce-3.6.1" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/jms http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd http://www.mulesoft.org/schema/mule/jbossts http://www.mulesoft.org/schema/mule/jbossts/current/mule-jbossts.xsd http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd"> <spring:beans> <!-- redelivery policy --> <spring:bean id="redeliverypolicy" class="org.apache.activemq.redeliverypolicy"> <spring:property name="maximumredeliveries" value="5" /> <spring:property name="initialredeliverydelay" value="5000" /> <spring:property name="redeliverydelay" value="5000" /> <spring:property name="useexponentialbackoff" value="true" /> <spring:property name="backoffmultiplier" value="1.5" /> </spring:bean> <!-- activemq connection factory --> <spring:bean id="amqxafactory" class="org.apache.activemq.activemqxaconnectionfactory" lazy-init="true" name="amqxafactory"> <spring:property name="brokerurl" value="tcp://localhost:61616" /> <spring:property name="redeliverypolicy" ref="redeliverypolicy" /> </spring:bean> </spring:beans> <jbossts:transaction-manager doc:name="jboss transaction manager"> <property key="com.arjuna.ats.arjuna.coordinator.defaulttimeout" value="47" /><!-- in seconds --> <property key="com.arjuna.ats.arjuna.coordinator.txreapertimeout" value="108000" /><!-- in milliseconds --> </jbossts:transaction-manager> <jms:activemq-connector name="active_mqconnectormessages" specification="1.1" validateconnections="true" doc:name="active mq xa" persistentdelivery="true" connectionfactory-ref="amqxafactory" numberofconsumers="1" maxredelivery="5"> <reconnect-forever frequency="10000" /> </jms:activemq-connector> <flow name="xatestflow"> <jms:inbound-endpoint queue="xa.test" doc:name="jms" connector-ref="active_mqconnectormessages"> <xa-transaction action="always_begin" /> </jms:inbound-endpoint> <logger message="message queue: #[payload]" level="info" doc:name="logger" /> <scripting:component doc:name="fail if payload contains fail"> <scripting:script engine="groovy"><![cdata[if (payload.contains("fail")) { throw new illegalargumentexception("failed...") } ]]></scripting:script> </scripting:component> <logger message="message ready" level="info" doc:name="logger" /> </flow> </mule>
it took time, discovered solution. there 2 types of configuration, server side in activemq , client side.
in client redeliverypolicy changed maximumredeliveries 0. on server created redeliveryplugin in activemq.xml:
<broker ....> ...... <plugins> <redeliveryplugin fallbacktodeadletter="true" sendtodlqifmaxretriesexceeded="true"> <redeliverypolicymap> <redeliverypolicymap> <redeliverypolicyentries> <!-- destination specific policy --> <redeliverypolicy queue="amm.input.to.router" maximumredeliveries="3" redeliverydelay="7000" initialredeliverydelay="5000" usecollisionavoidance="true" /> </redeliverypolicyentries> <!-- fallback policy other destinations --> <defaultentry> <redeliverypolicy maximumredeliveries="4" useexponentialbackoff="true" initialredeliverydelay="10000" redeliverydelay="5000" usecollisionavoidance="true" backoffmultiplier="1.5" maximumredeliverydelay="93600000" /> </defaultentry> </redeliverypolicymap> </redeliverypolicymap> </redeliveryplugin> </plugins> </broker> now activemq server takes care of redeliveries, not client.
see http://activemq.apache.org/message-redelivery-and-dlq-handling.html
Comments
Post a Comment