I'm attempting to send a message from an AMQ Virtual Topic consumer to an
http endpoint using http4 with transactions. When the http service is down
http4 returns a org.apache.http.conn.HttpHostConnectException. When this
exception is thrown I would like the transaction to be rolled back and the
failed message to be placed back in the queue. AMQ then has a redelivery
policy for these messages. All other exceptions are marked has handled and
placed in a DLQ.

The route looks like this,
<route id="service.requests.consumer" streamCache="true">
        <from
uri="activemq:Consumer.service-requests.VirtualTopic.service.requests"/>
        <convertBodyTo type="String" />
        <setHeader headerName="CamelHttpMethod">
                <constant>POST</constant>
        </setHeader>
        <transacted ref="PROPAGATION_REQUIRES_NEW"/>
        <to uri="http4:{{service.requests.httpproduceruri}}"/>
        <onException>
                
<exception>org.apache.http.conn.HttpHostConnectException</exception>
                <rollback markRollbackOnly="true"/>
        </onException>
        <onException>
                <exception>java.lang.Exception</exception>
                <handled>
                  <constant>true</constant>
                </handled>
                <transform>
                        <simple>{Exception:${exception}, 
Request:${body}}</simple>
                </transform>
                <to uri="activemq:queue:service-requests.dlq"/>
        </onException>
</route>

The DQL piece of the route works perfectly. But I'm not seeing what I would
expect from the rollback. My expectation was that by using <rollback
markRollbackOnly="true"/> I should see no exception when I do the rollback.
However this is not the case, when I look at the log I see a
RollbackExchangeException and I don't know why.

org.apache.camel.RuntimeCamelException:
org.apache.camel.RollbackExchangeException: Intended rollback.
Exchange[Message: ]
        at
org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1157)[88:org.apache.camel.camel-core:2.8.0.fuse-07-15]
        at
org.apache.camel.component.jms.EndpointMessageListener$EndpointMessageListenerAsyncCallback.done(EndpointMessageListener.java:174)[93:org.apache.camel.camel-jms:2.8.0.fuse-07-15]
        at
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:110)[93:org.apache.camel.camel-jms:2.8.0.fuse-07-15]
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:560)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:498)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1058)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1050)[94:org.springframework.jms:3.0.5.RELEASE]
        at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)[94:org.springframework.jms:3.0.5.RELEASE]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown
Source)[:1.7.0_07]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown
Source)[:1.7.0_07]
        at java.lang.Thread.run(Unknown Source)[:1.7.0_07]

Is there something I'm missing between the AMQ transaction and the camel
route? Any help would be greatly appreciated, thank you.



--
View this message in context: 
http://camel.465427.n5.nabble.com/Odd-AMQ-Transaction-Behavior-tp5737418.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to