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

Apache Camel处理HTTP请求401异常重试仍失败问题咨询

问题核心原因

你当前的写法存在执行顺序错误:onException块中编写的自定义处理逻辑,默认会在所有配置的重投递尝试全部失败后才会执行。你配置了maximumRedeliveries(1),Camel会先拿着原始Exchange(包含你硬编码的无效Authorization头12345)重试1次,两次请求都失败后,才会执行你写的设置新Header、打日志的逻辑,所以重试请求自然还是返回401。

正确实现方案

你需要使用onRedelivery处理器,在每次重投递发起前执行Token刷新、Header更新的逻辑,保证重试请求携带新的有效凭证。

修正后的代码示例

// 定义重投递前的处理器,负责刷新Authorization头
Processor refreshTokenProcessor = exchange -> {
    // 这里替换为你实际生成有效令牌的逻辑,示例为硬编码
    exchange.getIn().setHeader("Authorization", "abcde");
};

onException(HttpOperationFailedException.class)
    // 可选:仅捕获401状态码的异常,避免其他HTTP错误触发无效重试
    .onWhen(exchange -> {
        HttpOperationFailedException e = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, HttpOperationFailedException.class);
        return e.getStatusCode() == 401;
    })
    .maximumRedeliveries(1)
    // 配置重投递前执行的处理器
    .onRedelivery(refreshTokenProcessor)
    // 可选:如果重试成功则不向上抛出异常
    .handled(true)
    // 重投递全部失败后才会执行的兜底逻辑
    .log("重试失败 最终Header: ${headers.Authorization} ${body}");

from("jms:queue:Queue")
    .unmarshal(receiptFormat)
    .bean(ModelTranslator.class, "reqest")
    .marshal(requestFormat)
    .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
    .setHeader("Accept", constant("application/json"))
    .setHeader(Exchange.HTTP_METHOD, constant(org.apache.camel.component.http.HttpMethods.POST))
    .setHeader("Authorization", constant("12345"))
    .to("log:DEBUG?showBody=true&showHeaders=true")
    .to("https://test.net/rest/api/email")
    .to("log:DEBUG?showBody=true&showHeaders=true");

额外注意事项

  • 如果使用的是camel-http4/camel-http组件,建议在HTTP端点URI中添加disableStreamCache=false或者开启流缓存,避免重试时请求体被消费无法重复读取。
  • 如果服务端返回的401附带WWW-Authenticate头要求特定认证逻辑,需要确认你生成的令牌格式符合接口要求。

内容的提问来源于stack exchange,提问作者BenW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:36:03