父Router统一异常处理:子Router异常仅设Exchange属性后交父路由处理
解决方案
Camel 路由级onException默认捕获异常后会终止异常向上传播,你当前的写法会导致子路由处理完加属性的逻辑后,异常被直接截断,无法流转到父路由的全局异常处理器,按以下方式调整即可实现需求。
修正后代码
public class ParentRouter extends RouteBuilder { @Override public void configure() throws Exception { // 父路由全局异常处理,作为最终异常处理逻辑执行 onException(CustomException.class) .process(new ExceptionProcessor()) .handled(true); from("direct:parent-route") .to("direct:child-route"); from("direct:child-route") .onException(CustomException.class) // 第一步:执行子路由自定义逻辑,给Exchange打异常标记 .process(new Processor(){ @Override public void process(Exchange exchange){ exchange.setProperty("childExceptionFlg", "true"); } }) // 关键配置:声明当前异常未被处理,继续向上抛给父路由 .handled(false) .end() // 此处为子路由原有业务逻辑 .throwException(new CustomException("子路由触发测试异常")); } }
核心配置说明
- 子路由的异常处理块必须显式配置
.handled(false):该配置会告知Camel,当前异常处理器仅做前置属性注入逻辑,没有完成异常的最终处理,执行完配置的Processor后,会将原始异常沿着路由调用栈继续向上传递,父路由配置的全局onException就能正常捕获异常,执行ExceptionProcessor中的最终处理逻辑。 - 子路由的
onException块需要用.end()闭合,避免后续业务逻辑被错误归到异常处理分支中。 - 不要在子路由异常处理块中添加
handled(true)、transform、to等会终结异常传播的操作,否则会导致异常无法流转到父路由。
内容的提问来源于stack exchange,提问作者jbabu
相关产品推荐
相关产品推荐

