【问题标题】:WebClient should ignore unsucessful requestsWebClient 应该忽略不成功的请求
【发布时间】:2022-02-05 01:17:45
【问题描述】:

如果url1返回许多结果但url2返回404,以下代码会导致一个空列表。如何正确忽略错误并继续url1的成功响应?

        Set<String> list = new HashSet<>();

    Mono<String> first = WebClient.create(url1)
            .get()
            .retrieve()
            .bodyToMono(String.class)
            .onErrorResume(e -> {
                return Mono.empty();
            });

    Mono<String> two = WebClient.create()
            .get()
            .retrieve()
            .bodyToMono(String.class)
            .onErrorResume(e -> {
                return Mono.empty();
            });

    Flux.zip(first, two)
            .doOnComplete(() -> System.out.printf("done: %d\n", list.size()))
            .subscribe(
                    responses -> {
                        for (Object response : responses) {
                            String[] lines = ((String)response).split("\n");
                            for(String line : lines) {
                                list.add(line);
                            }
                        }
                    }
            );

【问题讨论】:

    标签: java spring-boot spring-webflux spring-webclient


    【解决方案1】:

    我已经简化了您的示例,将两个 webclient 调用替换为预期的输出,主要用于演示目的。

    您可以使用merge 代替zip,以避免在单个源为空时整个Flux 返回空。

    Flux.merge(Mono.just("1\n2\n3"), Mono.empty())
                    .doOnComplete(() -> System.out.printf("done: %d\n", list.size()))
                    .subscribe(
                            responses -> {
                                List<String> stringList = Arrays.stream(responses.split("\n")).collect(Collectors.toList());
                                stringList.forEach(System.out::println);
                            });
    

    JavaDoc

    注意

    值得一提的是,在subscribe 方法中处理结果并将其添加到在反应流之外定义的变量中有点不寻常。更预期的用例是处理flatMap/map 中的数据,并从您的方法中返回Mono&lt;List&lt;String&gt;&gt;Flux&lt;String&gt;

    返回Mono&lt;List&lt;String&gt;&gt;的示例

    Flux.merge(Mono.just("1\n2\n3"), Mono.empty())
                    .doOnComplete(() -> System.out.printf("done: %d\n", list.size()))
                    .flatMap(strings -> Flux.fromArray(strings.split("\n")))
                    .collectList()
    

    【讨论】:

      猜你喜欢
      • 2019-07-12
      • 2015-01-29
      • 2014-07-04
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 2013-03-07
      相关资源
      最近更新 更多