如果route抛出异常并且handle设置为true,则只执行doFinally中的第一个处理器

时间:2013-12-05 12:18:43

标签: apache-camel apache-servicemix blueprint-osgi

我有一个Camel Blueprint定义,其中两个Camel上下文各包含一个路径。

调用第一个上下文路由,然后调用第二个上下文的路由。现在,如果在第二个路由中抛出异常并且onException设置handled=true,则在第一个路由doFinally块中仅调用第一个处理器。

这是我的蓝图定义:

<?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"/>。我在这里错过了什么吗?任何帮助表示赞赏。

我在Apache Servicemix 4.5.2中使用Camel 2.10.6。

此致 多米尼克

1 个答案:

答案 0 :(得分:0)

您可以考虑使用多播[1]作为此问题的解决方法。

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

当然,这与流水线处理不同,但在某些情况下,doFinally块可以独立发送两条消息。

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