我有一个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。
此致 多米尼克
答案 0 :(得分:0)
您可以考虑使用多播[1]作为此问题的解决方法。
<doFinally>
<multicast>
<to uri="log:FIRST_FINALLY"/>
<to uri="log:SECOND_FINALLY"/>
</multicast>
</doFinally>
当然,这与流水线处理不同,但在某些情况下,doFinally
块可以独立发送两条消息。