Если для маршрута выдано исключение и обработано значение true, выполняется только первый процессор в doFinally.

У меня есть определение Camel Blueprint с двумя контекстами Camel, каждый из которых содержит один маршрут.

Вызывается маршрут первого контекста, который, в свою очередь, вызывает маршрут второго контекста. Теперь, если во втором маршруте выдается исключение и onException устанавливает handled=true, в первом блоке маршрутов doFinally вызывается только первый процессор.

Вот мое определение Blueprint:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:camel="http://camel.apache.org/schema/blueprint"
          xsi:schemaLocation="
      http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
      http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <bean id="myException" class="java.lang.RuntimeException">
        <argument value="Booom" />
    </bean>

    <camelContext id="firstContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="firstRoute">
            <from uri="direct-vm:start"/>
            <doTry>
                <to uri="log:FIRST_TRY"/>
                <to uri="direct-vm:generateException"/>
                <to uri="log:SECOND_TRY"/>
                <doFinally>
                    <to uri="log:FIRST_FINALLY"/>
                    <to uri="log:SECOND_FINALLY"/>
                </doFinally>
            </doTry>
            <log message="The message contains ${body}"/>
            <to uri="mock:result"/>
        </route>
    </camelContext>

    <camelContext id="secondContext" trace="false" xmlns="http://camel.apache.org/schema/blueprint">
        <onException>
            <exception>java.lang.Exception</exception>
            <handled>
                <constant>true</constant>
            </handled>
        </onException>
        <route id="secondRoute">
            <from uri="direct-vm:generateException"/>
            <throwException ref="myException"/>
        </route>
    </camelContext>

</blueprint>

Распечатывается только <to uri="log:FIRST_FINALLY"/>. Я не вижу <to uri="log:SECOND_FINALLY"/>. Я что-то упустил здесь? Любая помощь приветствуется.

Я использую Camel 2.10.6 внутри Apache Servicemix 4.5.2.

С уважением Доминик


person DominikKunz    schedule 05.12.2013    source источник
comment
Хорошая идея — попробовать то, что сказано здесь: camel.apache.org/support, например, для обновления Верблюд и попробуйте с более поздним выпуском и т. д.   -  person Claus Ibsen    schedule 05.12.2013
comment
Только что узнал, что он работает с версии 2.12.0, моя единственная проблема в том, что я не могу обновиться. Поскольку мы работаем внутри Redhat Fuse ESB 6.0 (или Servicemix 4.5.2). Не знаю, можно ли легко обновить Camel внутри одного из них.   -  person DominikKunz    schedule 05.12.2013
comment
Red Hat Fuse 6.0 вы можете обратиться в службу поддержки клиентов Red Hat, чтобы получить исправление для текущей версии. Для SMX вам нужно дождаться новой версии, поддерживающей Camel 2.12 и выше, которая будет SMX 4.6.0 (еще не выпущена)   -  person Claus Ibsen    schedule 05.12.2013
comment
Спасибо за разъяснения, собираюсь проверить мои варианты. Сейчас я пытаюсь решить проблему, пока не получу исправление или SMX 4.6.0.   -  person DominikKunz    schedule 06.12.2013


Ответы (1)


Вы можете рассмотреть возможность использования многоадресной рассылки [1] в качестве решения этой проблемы.

<doFinally>
  <multicast>
    <to uri="log:FIRST_FINALLY"/>
    <to uri="log:SECOND_FINALLY"/>
  </multicast>
</doFinally>

Конечно, это не то же самое, что конвейерная обработка, но в некоторых случаях блок doFinally может просто отправить два сообщения независимо друг от друга.

[1] http://camel.apache.org/multicast

person Henryk Konsek    schedule 14.01.2014