Apache camel 跨camel上下文捕获异常

Apache camel 跨camel上下文捕获异常,apache-camel,Apache Camel,我有两条路线-每一条都在不同的骆驼环境中: <camelContext id="camelContext1" xmlns="http://camel.apache.org/schema/blueprint"> <onException> <exception>com.me.MyException</exception> <to uri="log:osgiExecutorLog"/&g

我有两条路线-每一条都在不同的骆驼环境中:

<camelContext id="camelContext1" xmlns="http://camel.apache.org/schema/blueprint">
        <onException>
           <exception>com.me.MyException</exception>
           <to uri="log:osgiExecutorLog"/>
        </onException>

        <route id="MyRoute">
            <from uri="amq:test" />
                <to uri="direct:MyDirect"/>
        </route>
</camelContext>

<camelContext id="camelContext2" xmlns="http://camel.apache.org/schema/blueprint">

        <route id="MyRoute">
            <from uri="direct:MyDirect" />
                <process ref="myProc"/>
        </route>
</camelContext>

com.me.MyException

在某些情况下,myProc将抛出MyException,我希望camel上下文1中的OneException能够捕捉到这一点。我尽了最大的努力,但没有成功;这就像在不支持的camel上下文中捕获异常一样,还是我遗漏了什么?

您可以捕获异常并向某种错误处理端点发送消息,而不是尝试将异常返回到其他上下文(由于camel 2.x中的机制,这可能甚至可能不可能)

只要知道端点名称,就可以在不同的管线生成器或上下文中轻松定义

每个路由的顶部都有完全相同的样板异常处理程序,例如:

onException(Exception.class).handled(true).to("direct-vm:errors")
我们通常在不同的路由构建器之间使用这种自定义错误处理(在相同的上下文中,但是该模式可以很容易地跨上下文应用)


例如,在我们的应用程序中,我们捕获异常,将它们聚合到一个列表中,每当15秒过去没有新的异常时,我们就通过smtp发送一封电子邮件——使用定义为
from(“direct:errors”)…

的驼峰路由非常简单。

是否需要使用两个单独的上下文?你能不能在一个上下文中使用两个RouteBuilder?@vikingsteve感谢你的评论;这就是之前编写的方法-我试图在一个公共位置处理异常,这样我就不必重复代码。我不确定是否有适当的机制,但我会尝试在每个上下文中重新定义异常处理,如果必要的话,完全相同(我们所有的上下文和路由生成器都重新定义了顶部的OneException内容)顺便说一句,
direct:
如何在驼峰上下文之间工作?我的理解是,您需要使用
vm:
组件在上下文之间进行通信。实际上,是Talend ESB的direct vm组件跨vm工作!我认为,这看起来是一个公平的解决方案;我正在考虑添加beanRef,以便处理异常但将其发送到直接vm:错误也会更好!我想,我在重试方面有点麻烦-它不会从发起人处重试;会试试我的运气!游戏有点晚了,但我认为这种模式只有在您没有在第一个路由中转换消息时才有效。也就是说,如果您在第二个路由中遇到异常,并且input是转换后的消息,那么您永远不能将原始消息发送到错误路由。然后您需要抛出异常,让第一个路由发送它并使用原始消息。