Hi

a)
Ah that might not be clearly stated in the documentation.

It's an *all* or *nothing* with transactions. If using transactions
then it's the backing system (the transaction manger) responsibility
to handle redelivery - not Camel. Camel in this case only supports
delaying a fixed delay before the rollback is triggered.

And as you use ActiveMQ as the backing system it is the ActiveMQ
transaction manger that handles the redelivery. And it uses 5 or is it
6 redeliveries by default. So you should configure ActiveMQ how
redelivery should be done.


b)
That said I turn to the onException

Is TechnicalException and FunctionalException related as such one is
inherited from the other?
eg: FunctionalException extends TechnicalException ?

Camel uses (by default) an instanceof test to verify which onException
should handle the exception.

You might have a use-case using transactions and onException that
needs to be checked
- You have onExceptions that also is meent to supoorts catch exception
this exception and route it differently. And then you can have the
handled=true to state it's okay, newer mind the exception I have
handled it and the TX = OK.
- But it can also be used as a if this exception is thrown then only
retry 2 times instead of default 5 times etc.
- etc.

c)
In any case it should really only call the myOwnErrorHandler only for
the FunctionalException.

I will check up on your spring XML and add it as a unit test in camel.



/Claus Ibsen
Apache Camel Committer
Blog: http://davsclaus.blogspot.com/



On Tue, Nov 18, 2008 at 5:06 PM, Fush <[EMAIL PROTECTED]> wrote:
>
> Hi! Below is a snippet of my camel route/xml. As you can see, I'm trying to
> set up some transaction and error handling there. But I've ran into a couple
> of strange issues. Are these known? Can anyone here explain them?
>
> 1. Even if the exception thrown by myBean is a TechnicalException (ie. not a
> FunctionalException), the method on the myOwnErrorHandler bean is invoked.
> How can that happen?
> 2. Even if maximumRedeliveries is set to 0, for the two onException clauses,
> as well as in the redeliveryPolicyConfig, the message is redelivered 5 times
> (as default) when an exception occurs. Why are my settings of 0 not read?
> 3. Based on the above, can you spot any obvious errors in my configurations?
> Or should I assume the spring interpretation to be flawed?
>
> Here's the important part of my XML:
>
> <camelContext id="myRouting"
>        xmlns="http://activemq.apache.org/camel/schema/spring";>
>        <route errorHandlerRef="transactionErrorHandler">
>                <from uri="activemq:queue/myQueue/aQueue" />
> <!--                    <policy ref="required"/>-->
>                <choice>
>                       <when>
>                                <xpath>//type = 'myType'</xpath>
>                                <onException>
>                                        
> <exception>org.my.exception.TechnicalException
>                                        </exception>
>                                        <redeliveryPolicy 
> maximumRedeliveries="0" />
>                                        <handled>
>                                                <constant>true</constant>
>                                        </handled>
>                                        <!-- ANY SPECIFIC HANDLING HERE? -->
>                                </onException>
>                                <onException>
>                                        
> <exception>org.my.exception.FunctionalException
>                                        </exception>
>                                        <redeliveryPolicy 
> maximumRedeliveries="0" />
>                                        <handled>
>                                                <constant>true</constant>
>                                        </handled>
>                                        <to uri="bean:myOwnErrorHandler" />
>                                </onException>
>                                <unmarshal>
>                                        <jaxb prettyPrint="true" 
> contextPath="org.my.domain.message" />
>                                </unmarshal>
>                                <to uri="bean:myBean" />
>                        </when>
>                </choice>
>        </route>
> </camelContext>
>
> <bean id="jmsTransactionManager"
> class="org.springframework.jms.connection.JmsTransactionManager">
>        <property name="connectionFactory" ref="jmsConnectionFactory" />
> </bean>
>
> <bean id="jmsConnectionFactory"
> class="org.apache.activemq.ActiveMQConnectionFactory">
>        <property name="brokerURL" value="${org.my.activemq.url}"/>
> </bean>
>
> <bean id="jmsConfig"
> class="org.apache.camel.component.jms.JmsConfiguration">
>   <property name="connectionFactory" ref="jmsConnectionFactory"/>
>   <property name="transactionManager" ref="jmsTransactionManager"/>
>   <property name="transacted" value="true"/>
>   <property name="concurrentConsumers" value="1"/>
> </bean>
>
> <!-- camel policy we refer to in our route -->
> <bean id="required"
> class="org.apache.camel.spring.spi.SpringTransactionPolicy">
>        <property name="template" ref="PROPAGATION_REQUIRED"/>
> </bean>
>
> <!-- the standard spring transaction template for required -->
> <bean id="PROPAGATION_REQUIRED"
> class="org.springframework.transaction.support.TransactionTemplate">
>    <property name="transactionManager" ref="jmsTransactionManager"/>
> </bean>
>
> <!-- the transaction error handler we refer to from the route -->
> <bean id="transactionErrorHandler"
> class="org.apache.camel.spring.spi.TransactionErrorHandlerBuilder">
>    <property name="transactionTemplate" ref="PROPAGATION_REQUIRED"/>
>    <!-- here we refer to the configurations of the error handler -->
>    <property name="delayPolicy" ref="redeliveryPolicyConfig"/>
> </bean>
>
> <!-- configuration of the transaction error handler -->
> <bean id="redeliveryPolicyConfig"
> class="org.apache.camel.processor.RedeliveryPolicy">
>    <property name="delay" value="5000"/>
>    <property name="maximumRedeliveries" value="0"/>
> </bean>
>
> <!-- ActiveMQ instance -->
> <bean id="activemq" class="org.apache.camel.component.jms.JmsComponent">
>    <property name="configuration" ref="jmsConfig"/>
> </bean>
>
> <bean id="myOwnErrorHandler" class="org.my.beans.MyErrorHandler"/>
>
> <bean id="myBean" class="org.my.beans.MyBean"/>
> --
> View this message in context: 
> http://www.nabble.com/1.5-error-handling-Spring-config-buggy-not-complete--tp20562554s22882p20562554.html
> Sent from the Camel - Users mailing list archive at Nabble.com.
>
>

Reply via email to