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
相关产品推荐
相关产品推荐

