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