如何在Camel的onRedelivery执行前,于onException块中执行操作?
Apache Camel 重试前执行操作的解决方案
你现在遇到的问题是因为onException里的process是在所有重试失败后才会执行的逻辑,而要在每次重试触发前执行操作完全可行——直接用你代码里已经用到的onRedelivery方法就行,它的核心作用就是在每次重传之前执行自定义逻辑。
执行顺序说明
Camel onException的处理流程是:
- 触发异常后进入
onException块 - 每次重试前,先执行
onRedelivery中的逻辑 - 随后执行重传操作
- 当所有重试次数耗尽后,才会执行
process、handled这类最终处理逻辑
修改后的代码示例
把你想在重试前执行的操作放到onRedelivery里即可,比如:
.onException(SomeException.class) .maximumRedeliveries(3) .redeliveryDelay(5000) .onRedelivery(e -> { // 这里写重试前要执行的操作:日志打印、资源清理、参数调整等 log.info("准备执行第{}次重试", e.getExchange().getIn().getHeader(Exchange.REDELIVERY_COUNTER)); }) .retryAttemptedLogLevel(WARN) .process(e -> { // 这里是所有重试失败后才会执行的最终处理逻辑 log.info("所有重试已完成,执行异常收尾处理"); }) .handled(true)
如果需要更复杂的重试前处理,也可以把逻辑封装成独立Processor,再通过onRedelivery(Processor processor)传入,结构更清晰:
// 定义重试前专用处理器 Processor preRetryProcessor = exchange -> { Integer retryCount = exchange.getIn().getHeader(Exchange.REDELIVERY_COUNTER, Integer.class); log.warn("即将启动第{}次重试", retryCount); // 可添加更多重试前准备逻辑 }; // 在onException中关联处理器 .onException(SomeException.class) .maximumRedeliveries(3) .redeliveryDelay(5000) .onRedelivery(preRetryProcessor) .retryAttemptedLogLevel(WARN) .process(e -> log.info("重试全部失败,执行异常最终处理")) .handled(true)
内容的提问来源于stack exchange,提问作者Dinu Nicolae
相关产品推荐
相关产品推荐

