根据响应重试WebClient

use*_*629 1 java spring spring-boot spring-webflux

我创建了一个Spring webflux webclient。我想根据我的响应重复相同的操作。例如:如果数据仍然为空,我想重试以获取数据。怎么做 ?

Flux<Data> data = webClient.get()
                .uri("/api/users?page=" + page)
                .retrieve()
                .flatMap(o -> {
                  o.subscribe(data -> {
                      if(data == null) {
                         // WHAT TO DO HERE, TO REPEAT THE SAME CALL ?
                         o.retry();
                      }
                });
                return o;
            })
            .bodyToFlux(Data.class);
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以使用retry(Predicate<? super Throwable> retryMatcher),它将根据可抛出条件重试该操作。

在下面的代码中,如果从客户端接收的数据为null,则返回Mono.error,然后基于重试中的错误条件,将再次执行上述操作。

您还可以通过以下方式限制重试次数:

retry(long numRetries, Predicate<? super Throwable> retryMatcher)

final Flux<Data> flux = WebClient.create().get().uri("uri").exchange().flatMap(data -> {
      if (data == null)
        return Mono.error(new RuntimeException());
      return Mono.just(data);

    }).retry(throwable -> throwable instanceof RuntimeException)
        .flatMap(response -> response.bodyToMono(Data.class)).flux();
Run Code Online (Sandbox Code Playgroud)