Hi

What Camel version do you use?
And have you tried with a newer release?



On Thu, Jan 10, 2013 at 11:27 AM, Lampis Flavio <flavio.lam...@zkb.ch> wrote:
> Hello Camel users
>
> I am new to this forum / mailing list.
>
> We are experiencing problems in our project with the combination of onError 
> and TransactionErrorHandler. Our set up is a bit complicated. I hope you read 
> through anyway.
>
> We want to distinguish between recoverable and nonrecoverable 
> errors/exceptions. We want to decide in our code what's recoverable and 
> what's not for any Exception that occurs.
>
> This is the setup of our errorHandlers and onException definitions:
>
>         ...
>
>         <camel:camelContext streamCache="true" trace="true" 
> xmlns="http://camel.apache.org/schema/spring";>
>
>                 <errorHandler id="eh_jms" type="TransactionErrorHandler"
>                         transactionTemplateRef="jmsTransactionTemplate">
>                         <redeliveryPolicy redeliveryDelay="3000"
>                                 maximumRedeliveries="-1" 
> retryAttemptedLogLevel="WARN" />
>                 </errorHandler>
>
>
>                 <errorHandler id="eh_jpa" type="TransactionErrorHandler"
>                         transactionTemplateRef="jpaTransactionTemplate">
>                         <redeliveryPolicy redeliveryDelay="3000"
>                                 maximumRedeliveries="-1" 
> retryAttemptedLogLevel="WARN" />
>                 </errorHandler>
>
>
>                 <routeContextRef ref="routecontext_errorroute" />
>
>                 <routeContextRef ref="routecontext_test_error_routes" />
>
>                 <onException id="onNonrecoverable">
>                         <exception>java.lang.Exception</exception>
>                         <onWhen>
>                                 <method id="isNonrecoverable" 
> bean="myErrorBean"
>                                         method="isNonrecoverable" />
>                         </onWhen>
>                         <redeliveryPolicy maximumRedeliveries="0" />
>                         <handled>
>                                 <constant>true</constant>
>                         </handled>
>
>                         <to uri="direct:nonrecoverableerror" />
>                 </onException>
>
>                 <onException id="onRecoverable"
>                         onRedeliveryRef="myRecoverableErrorProcessor">
>                         <exception>java.lang.Exception</exception>
>                         <onWhen>
>                                 <method id="isRecoverable" bean="myErrorBean"
>                                         method="isRecoverable" />
>                         </onWhen>
>                         <redeliveryPolicy maximumRedeliveries="-1"
>                                 redeliveryDelay="2000" logStackTrace="false" 
> retryAttemptedLogLevel="WARN"
>                                 backOffMultiplier="2" 
> useExponentialBackOff="true" />
>                 </onException>
>
>                 ...
>
>         </camel:camelContext>
>
> We have transacted routes - jms and jpa. Therefore we have defined two 
> TransactionErrorHandler with different transactionTemplates.
> The first onException definition calls myErrorBean.isNonrecoverable() which 
> returns true or false.
> The second onException definition calls myErrorBean.isRecoverable(), which 
> returns the opposite of isNonRecoverable.
> I always expect one onException definition to kick in. And it ususally does 
> e.g. for this test route:
>
>                 <route id="fromJMS1ToExceptionThrowingBean" 
> errorHandlerRef="eh_jms">
>                         <from
>                                 
> uri="jms:queue:{{routes.general.queue.1}}?selector=someSelector" />
>                         <transacted ref="jmsPROPAGATION_REQUIRED" />
>                         <to 
> uri="bean:myExceptionThrowingBean?method=throwException" />
>                         <log message="end fromJMS1ToExceptionThrowingBean" />
>                 </route>
>
> myExceptionThrowingBean is a simple bean which I can configure: how many 
> times to throw an exception, what exception to throw etc.
>
> With the route optimisticLockMulticast I want to update one existing entity 
> on a database with two different threads and cause an optimistic lock 
> exception.
>
>                 <route id="optimisticLockMulticast" errorHandlerRef="eh_jpa">
>                         <from uri="direct:optimisticLockMulticast" />
>                         <multicast parallelProcessing="true">
>                                 <to uri="direct:optimisticLockA" />
>                                 <to uri="direct:optimisticLockB" />
>                         </multicast>
>                         <log message="end optimisticLockMulticast" />
>                 </route>
>
>                 <route id="optimisticLockA" errorHandlerRef="eh_jpa">
>                         <from uri="direct:optimisticLockA" />
>                         <transacted ref="jpaPROPAGATION_REQUIRED" />
>                         <bean ref="myUpdateBean" method="updateEntity" />
>                         <log message="end optimisticLockA" />
>                         <to uri="direct:endA" />
>                 </route>
>
>                 <route id="optimisticLockB" errorHandlerRef="eh_jpa">
>                         <from uri="direct:optimisticLockB" />
>                         <transacted ref="jpaPROPAGATION_REQUIRED" />
>                         <bean ref="myUpdateBean" method="updateEntity" />
>                         <log message="end optimisticLockB" />
>                         <to uri="direct:endB" />
>                 </route>
>
>                 <route id="directEndA">
>                         <from uri="direct:endA" />
>                         <log message="end direct" />
>                 </route>
>
>                 <route id="directEndB">
>                         <from uri="direct:endB" />
>                         <log message="end direct" />
>                 </route>
>
>
> The entity is merged in myUpdateBean. The framework is not able to commit 
> both transactions as expected. That is a good thing, because this is the 
> behaviour we are trying to test.
> This is what I see in the log:
>
> The first Transaction could be committed:
> 08:08:07.166 [Thread-7] DEBUG TransactionErrorHandler  -
> Transaction commit (0x1fdbe17) redelivered(unknown) for (MessageId: 
> ID-MOB10086289-62103-1357628876915-0-3 on ExchangeId: 
> ID-MOB10086289-62103-1357628876915-0-1))
>
> The second could not be committed:
> 08:08:07.166 [Thread-6] WARN  TransactionErrorHandler  -
> Transaction rollback (0x1fdbe17) redelivered(unknown) for (MessageId: 
> ID-MOB10086289-62103-1357628876915-0-3 on ExchangeId: 
> ID-MOB10086289-62103-1357628876915-0-1)
> caught: Object of class [com.mycompany.model.MyModelEntityClass] with 
> identifier [103ace6d-19de-4dd4-b305-0716456e644f]: optimistic locking failed; 
> nested exception is org.hibernate.StaleObjectStateException: Row was updated 
> or deleted by another transaction (or unsaved-value mapping was incorrect): 
> [com.mycompany.model.MyModelEntityClass#103ace6d-19de-4dd4-b305-0716456e644f]
>
> And now at last we come to the problems: No redelivery occurs and no 
> onException kicks in. The exchange seems to end here. In other scenarios it 
> works.
>
> In the documentation on http://camel.apache.org/error-handler.html:
> "Exception Clause
> Using Error Handler combined with Exception Clause is a very powerful 
> combination. We encourage end-users to use this combination in your error 
> handling strategies. See samples and Exception Clause."
>
> But who is doing the rollback if an onException(MyTechnicalException) kicks 
> in?
>
> I hope I could make the problem clear and that someone might help. Thank you.
>
> Kindest regards, Flavio
>
> Freundliche Grüsse
> Flavio Lampis
> LIBSR
>
> Zürcher Kantonalbank, Geschäftshaus Hard F
> Briefadresse: Postfach, 8010 Zürich / www.zkb.ch
>
> Sie drucken diese E-Mail nicht aus? Die Umwelt dankt!
>
>
>
> ________________________________
>
> Disclaimer :
>
>
> Diese Mitteilung ist nur für die Empfängerin / den Empfänger bestimmt.
>
> Für den Fall, dass sie von nichtberechtigten Personen empfangen wird, bitten 
> wir diese höflich, die Mitteilung an die Zürcher Kantonalbank zurückzusenden 
> und anschliessend die Mitteilung mit allen Anhängen sowie allfällige Kopien 
> zu vernichten bzw. zu löschen. Der Gebrauch der Information ist verboten.
>
>
> This message is intended only for the named recipient and may contain 
> confidential or privileged information.
>
> If you have received it in error, please advise the sender by return e-mail 
> and delete this message and any attachments. Any unauthorised use or 
> dissemination of this information is strictly prohibited.



-- 
Claus Ibsen
-----------------
Red Hat, Inc.
FuseSource is now part of Red Hat
Email: cib...@redhat.com
Web: http://fusesource.com
Twitter: davsclaus
Blog: http://davsclaus.com
Author of Camel in Action: http://www.manning.com/ibsen

Reply via email to