如何获取Camel路由中故障节点Endpoint URI并传入自定义处理器
问题描述
我正在开发一个示例路由,路由结构如下:
- FROM: SOURCE ENDPOINT URI
- TO: TRANS ENDPOINT URI // 该TRANS端点处会发生错误或异常
- TO: TARGET ENDPOINT URI
需求为捕获抛出异常的故障端点URI,将其传递给自定义处理器。
对应的示例路由配置代码如下:
<route> <from uri="file:C:/MINTS/Source/"/> <to uri="file:C:/MINTS/TRANS/"/> <!-- 异常在此处抛出 --> <to uri="file:C:/MINTS/TARGET/"/> <onException> <exception>java.lang.Exception</exception> <handled> <constant>true</constant> </handled> <!-- 需要在此处捕获故障端点URI,传递给下方的自定义处理器 --> <process ref="MyExceptionProcessor" /> </onException> </route>
实现方法
Camel在路由调用端点抛出异常时,会自动将故障端点的URI存入Exchange的Exchange.FAILURE_ENDPOINT属性中,不需要额外修改路由配置,直接在自定义处理器中读取该属性即可拿到目标值。
自定义处理器示例代码:
import org.apache.camel.Exchange; import org.apache.camel.Processor; public class MyExceptionProcessor implements Processor { @Override public void process(Exchange exchange) throws Exception { // 获取发生故障的端点URI String failedEndpoint = exchange.getProperty(Exchange.FAILURE_ENDPOINT, String.class); // 如果需要获取捕获到的异常对象,可读取以下属性 // Exception caughtEx = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class); // 编写自定义业务逻辑即可 } }
补充说明:
- 该属性由Camel内核自动填充,只要异常是在端点调用阶段抛出,就能准确获取到对应的故障端点地址,适配当前的路由结构。
- 如果需要全局生效该异常处理逻辑,可以将
<onException>块移到路由外部的Camel上下文级别配置中,属性读取逻辑不受影响。
内容的提问来源于stack exchange,提问作者Ravi Kishore
相关产品推荐
相关产品推荐

