2015-05-12 2 views
1

Как работают транзакции на маршрутах Верблюда с Spring DSL и одним из маршрутов выбрасывается Exception?Операции с базами данных между несколькими маршрутами на верблюдах

Если routeB создает исключение, как исключение будет передаваться обратно на routeA.

Если исключение выбрано в routeB, я мог видеть, что transactionalErrorHandler обрабатывает исключение и откатывает транзакцию.

Установка errorHandlerRef="noErrorHandler" на routeB не помогает.

Как мы можем это сделать?

Мои Camel маршруты определение:

<route id="routeA"> 
    <from uri="direct-vm:endpointA" /> 
    <transacted /> 
    <to uri="direct-vm:endPointB" /> 
    <bean ref="beanA" method="save" /> 
    <onException> 
    <exception>java.lang.Exception> 
    <handled><constant>true</constant></handled> 
    <bean ref="beanA" method="handleError" /> 
    <rollback markRollbackOnly="true" /> 
    </onException> 
</route> 

<route id="routeB"> 
    <from uri="direct-vm:endPointB" /> 
    <throwException ref="ex"/> 
</route> 

ответ

1

В верблюд команда transacted просто обертка для Spring TransactionTemplate, в том, что он будет привлекать маршрут в сделке, предоставленной PlatformTransactionManager. Единственный вариант конфигурации, который вы получаете на org.apache.camel.spring.spi.SpringTransactionPolicy, - это поведение распространения, поэтому обработка откатов и т. Д. Должна выполняться в рамках транзакционного маршрута.

В этом случае вы должны поймать исключение из маршрута B, если оно попадет в обработчик ошибок, тогда уже слишком поздно.

<route id="routeA"> 
    <from uri="direct-vm:endpointA" /> 
    <transacted/> 
    <doTry> 
     <to uri="direct-vm:endPointB" /> 
     <doCatch> 
      <exception>java.lang.Exception</exception> 
      <bean ref="beanA" method="handleFail"/> 
     </doCatch> 
     <doFinally> 
      <bean ref="beanA" method="save" /> 
     </doFinally> 
    </doTry> 
</route> 

<route id="routeB"> 
    <from uri="direct-vm:endPointB" /> 
    <throwException ref="ex"/> 
</route> 
+0

Возможно, у меня возник вопрос с вопросом. Оба маршрута должны участвовать в транзакции и когда routeB выдает исключение, routeA onException должен обрабатывать исключение вместо транзакцииErrorHandler. – user2997551