Повторите попытку WebClient на основе ответа - PullRequest
1 голос
/ 21 сентября 2019

Я создал веб-клиент Spring webflux. Я хочу повторить ту же операцию, основываясь на моем ответе.Например: если данные все еще пусты, я хочу повторить попытку, чтобы получить данные.Как это сделать?

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);

1 Ответ

5 голосов
/ 23 сентября 2019

Вы можете использовать retry(Predicate<? super Throwable> retryMatcher), который будет повторять операцию на основе условия выброса.

В приведенном ниже коде я возвращаю 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();
...