Apache Camel:doCatch的onWhen断言无法获取EXCEPTION_CAUGHT求助
Apache Camel doCatch onWhen 无法获取异常的原因及解决思路
这确实是Apache Camel的设计特性,核心原因是**onWhen的执行时机早于异常被存入Exchange.EXCEPTION_CAUGHT属性的时机**:Camel会先评估onWhen的断言逻辑,确认是否要进入doCatch分支,之后才会把捕获的异常绑定到Exchange的EXCEPTION_CAUGHT属性中。而doCatch内部的处理器是在异常绑定完成后执行的,所以能正常获取到该属性。
以下是几种可行的解决思路:
用Simple表达式直接访问异常
Camel在onWhen的表达式上下文里内置了${exception}变量,直接指向当前捕获的异常,可直接用它判断异常消息:doCatch(ProcessingException.class) .onWhen(simple("${exception.message} contains '需要匹配的特定消息'")) .process(new MyProcessor());自定义Predicate时使用
exchange.getException()
如果需要更复杂的判断逻辑,自定义Predicate时不要依赖Exchange.EXCEPTION_CAUGHT属性,改用exchange.getException()方法——这个方法在onWhen阶段可以直接拿到当前捕获的异常:doCatch(ProcessingException.class) .onWhen(exchange -> { Exception caughtEx = exchange.getException(); return caughtEx instanceof ProcessingException && caughtEx.getMessage() != null && caughtEx.getMessage().contains("目标异常消息"); }) .process(new MyProcessor());其他表达式语言的适配用法
如果你使用OGNL、SpEL等其他表达式语言,同样可以直接访问上下文里的异常对象,比如OGNL语法可以写exception.message.contains('目标内容')来做判断。
内容的提问来源于stack exchange,提问作者WesternGun
相关产品推荐
相关产品推荐

