当前位置: 首页 > 知识库问答 >
问题:

Spring WebClient聚合多个401 UNAUTHORIZED错误以引发Exceptions.CompositeException

金嘉言
2023-03-14

当WebClient使用错误的令牌异步调用外部api(使用不同的查询参数)时,前几个调用返回401 UNAUTHORIZED,控制流因< code >异常而停止。CompositeException。我们在< code>WebClient实例中添加了如下过滤器,用于检查4xx和5xx响应状态代码,以抛出自定义异常

private final ExchangeFilterFunction responseFilter() {
    return ExchangeFilterFunction
            .ofResponseProcessor(response -> response.statusCode().isError() ? error(() -> new CustomException("API Error")) : just(response));

private WebClient buildWebClient(WebClient.Builder builder) {
    return builder
            .filter(responseFilter())
            .build();
}

现在的问题是,当第一次调用返回错误(401)时,CustomException不会被抛出,而是聚合了一堆调用并抛出Exceptions.CompositeException。在日志中,我们可以看到在复合失败之前至少有 3 或 4 401 个未授权。当第一个失败时,它不会引发预期的自定义异常。此WebClient调用发生在Flux内部.zip我不确定这是否与该问题有关。

共有1个答案

邓德厚
2023-03-14

当使用任何DelayError变量运算符时,reactor会将任何异常(如果超过1)收集到CompositeException中。

Reactor 提供了一个实用方法 Exceptions.unwrapMultiple,如果您只想在上游传播子集或单个错误,则帮助将复合异常解压缩到可抛出对象列表中 - Java 文档

Exceptions.unwrapMultiple

尝试将可抛投对象解包到可投掷对象列表中。这仅在所述 Throwable 是由 multiple(Throwable...) 构建的复合异常的情况下完成的,在这种情况下,列表包含包装为复合中的抑制异常的异常。在任何其他情况下,列表仅包含输入 Throwable(或者在空输入的情况下为空)。

下面是一个小示例,使用< code>unwrapMultiple仅传播< code>CompositeException中的第一个< code>Throwable。

    Flux<Object> range = Flux.range(1, 10)
            .flatMapDelayError(i -> Mono.error(new IllegalArgumentException(String.format("Error: %s", i))), 10, 1)
            .onErrorResume(throwable -> Mono.error(Exceptions.unwrapMultiple(throwable).get(0)));
    StepVerifier.create(range)
            .expectError(IllegalArgumentException.class)
            .verify();
 类似资料:
  • 问题内容: 我正在尝试在过滤器聚合块中过滤空桶,并且从elasticsearch收到错误。没有这个,响应将是巨大的,因为我正在查询大量指标和嵌套聚合(为简单起见,这是较大查询的一部分) 弹性反应: 我想做的是:如果对于给定的国家/地区存储区,则没有字段x(例如,国家UK-2个文档没有“ x”字段),请勿将国家/地区存储区返回给客户。 问题答案: 为此,您需要一个脚本,而脚本则在较高级别上稍有不同:

  • 当我尝试使用Hive执行非聚合命令时,查询似乎可以正常工作,如下所示: 从Airlines_Analysis.Airline中选择*;从Airlines_Analysis.Airline中选择Airlines.Month; org.apache.hive.service.cli.hivesqlexception:处理语句时出错:失败:执行错误,从org.apache.hive.service.cl

  • 我得到的错误是 请帮助我解决这个错误。非常感谢!

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 问题内容: 尝试执行以下查询时,我收到此错误。有什么想法或建议吗? 错误: 在包含外部引用的聚合表达式中指定了多个列。如果要聚合的表达式包含外部引用,则该外部引用必须是表达式中唯一引用的列。 问题答案: 问题是您不能在聚合函数中组合外部和内部引用 因此将其更改为 这是更详尽的解释。

  • 我正在与之通信的服务器可以选择将多个调用加入到一个中。所以假设我加入2。。n个调用到一个调用中,响应可以检索0。。n个错误。有没有办法在一次一次性使用中避免多个错误?