Discussion:
How to override dlqDeliveryFailureCause
Martin Pelikán
2018-08-17 12:39:02 UTC
Permalink
Hi All,

I am trying to override/enhance JMS Message Header dlqDeliveryFailureCause
or at least add my own header with Error message when Exception occurs in
route in transacted route.

Goal is to see Camel Exception in my message after sending to DLQ when max.
number retries is exceeded. I am wondering if it is possible to achieve it
with my configuration because my route is transacted and message is rolled
back. Do you know any way how to do it with Redelivery configured on AMQ
broker or even with letting Camel handle Redelivery with RedeliveryPolicy?

Snippet of my configuration:

Activemq.XML

<destinationPolicy>
<policyMap>
<policyEntries>
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ."
useQueueForQueueMessages="true"/>
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>

<redeliveryPlugin fallbackToDeadLetter="true"
sendToDlqIfMaxRetriesExceeded="true">
<redeliveryPolicyMap>
<redeliveryPolicyMap>
<defaultEntry>
<redeliveryPolicy maximumRedeliveries="4"
initialRedeliveryDelay="5000"
redeliveryDelay="5000"/>
</defaultEntry>
</redeliveryPolicyMap>
</redeliveryPolicyMap>
</redeliveryPlugin>

Blueprint.xml:
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://localhost:61616,tcp://localhost:61617) />
<property name="redeliveryPolicy" ref="amqRedeliveryPolicy" />
</bean>

<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory"
ref="pooledConnectionFactory" />
<property name="concurrentConsumers" value="5" />
</bean>

<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig" />
<property name="transacted" value="true" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="deliveryPersistent" value="true" />
</bean>

<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>

<bean id="amqRedeliveryPolicy"
class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="0"/>
</bean>

<route>
<from uri="activemq:queue:test.queue"/>
<transacted />
<process ref="queueProcessor" />
</route>

Version of AMQ: 5.15.2
Version of Camel: 2.20.1

Thank you.
Martin
Claus Ibsen
2018-08-17 12:57:31 UTC
Permalink
Hi

I would not think you can do that, as the transacted ack mode with a
rollback is just a rollback command from the JMS session.
Its not like a new JMS message is being created and sent to a DLQ
destination where you can provide new message headers / body etc via
the JMS client and Camel.
Post by Martin Pelikán
Hi All,
I am trying to override/enhance JMS Message Header dlqDeliveryFailureCause
or at least add my own header with Error message when Exception occurs in
route in transacted route.
Goal is to see Camel Exception in my message after sending to DLQ when max.
number retries is exceeded. I am wondering if it is possible to achieve it
with my configuration because my route is transacted and message is rolled
back. Do you know any way how to do it with Redelivery configured on AMQ
broker or even with letting Camel handle Redelivery with RedeliveryPolicy?
Activemq.XML
<destinationPolicy>
<policyMap>
<policyEntries>
<deadLetterStrategy>
<individualDeadLetterStrategy queuePrefix="DLQ."
useQueueForQueueMessages="true"/>
</deadLetterStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<redeliveryPlugin fallbackToDeadLetter="true"
sendToDlqIfMaxRetriesExceeded="true">
<redeliveryPolicyMap>
<redeliveryPolicyMap>
<defaultEntry>
<redeliveryPolicy maximumRedeliveries="4"
initialRedeliveryDelay="5000"
redeliveryDelay="5000"/>
</defaultEntry>
</redeliveryPolicyMap>
</redeliveryPolicyMap>
</redeliveryPlugin>
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL"
value="failover:(tcp://localhost:61616,tcp://localhost:61617) />
<property name="redeliveryPolicy" ref="amqRedeliveryPolicy" />
</bean>
<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory"
ref="pooledConnectionFactory" />
<property name="concurrentConsumers" value="5" />
</bean>
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig" />
<property name="transacted" value="true" />
<property name="cacheLevelName" value="CACHE_CONSUMER" />
<property name="transactionManager" ref="jmsTransactionManager" />
<property name="deliveryPersistent" value="true" />
</bean>
<bean id="jmsTransactionManager"
class="org.springframework.jms.connection.JmsTransactionManager">
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="amqRedeliveryPolicy"
class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="0"/>
</bean>
<route>
<from uri="activemq:queue:test.queue"/>
<transacted />
<process ref="queueProcessor" />
</route>
Version of AMQ: 5.15.2
Version of Camel: 2.20.1
Thank you.
Martin
--
Claus Ibsen
-----------------
http://davsclaus.com @davsclaus
Camel in Action 2: https://www.manning.com/ibsen2
Loading...