骆驼:停止Splitter内的路线

时间:2015-08-26 15:54:16

标签: java apache-camel jbossfuse blueprint-osgi

我有以下路由,在第二个when子句中,我有一个生成的事件列表,并使用split来使用eventbean处理每个单独的事件。在bean中我有一个生成器模板,它将消息发送到端点。我遇到的问题是,如果端点未解决或者无法访问,则抛出异常,但路由仍在处理所有事件。但我想要的是我需要停止路由或不允许抛出异常后要处理的其他事件。所以我在分裂中使用内部,如果抛出异常我想停止路线或从分裂出来。我不确定这是否是正确的方法来处理我的问题,但试图看看这是否有效。

<route id="routeid">
          <from uri="{{queue.in}}"/>
          <choice>
                <when>
                    <simple>${body} contains 'somedata'</simple>
                    <to uri="bean:somebean?method=process" />
                </when>
                <when>
                    <simple>${body} contains 'somedata' || ${body} contains 'somedata' || ${body} contains 'somedata'</simple>
                    <to uri="bean:somebean?method=process" />
                    <filter>
                        <simple>${body.size} > 0</simple>
                        <split>
                            <doTry>
                                <simple>${body}</simple>
                                <to uri="bean:eventbean" />
                            <doCatch>
                                <exception>com.exception.EndpointNotFoundException</exception>
                                <handled>
                                    <constant>false</constant>
                                </handled>
                                <to uri="direct:addToErrorNotificationQueue" />
                                <stop/>
                            </doCatch>
                            </doTry>
                        </split>
                    </filter>
                </when>
</route>

2 个答案:

答案 0 :(得分:0)

您可以使用路由级别onException,如下所示,

<route id="routeid">
  <from uri="{{queue.in}}"/>
  <onException>
    <exception>java.lang.Exception</exception>
    <to uri="direct:handleException"/>
    <handled>
        <constant>false</constant>
    </handled     
  <onException>
  .
  .
  .
  .
  .
</route>

因此,任何异常都会发生在路径中的任何位置,它会捕获到onException并且剩余的代码将不会执行。

您可以将全局级别设置为onException。

希望它的帮助!!

答案 1 :(得分:0)

如果您只想捕获<split>内的异常,请将整个<split>放入<doTry>

<doTry>
    <split>
        <simple>${body}</simple>
        <to uri="bean:eventbean" />
    </split>
    <doCatch>...</doCatch>
</doTry>