You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:52:48