Повторите Mono с веб-клиентом от SpringFlux - PullRequest
0 голосов
/ 17 апреля 2020

Ситуация следующая: я отправил первый запрос, затем повторно отправил второй запрос с интервалом 5 с. Если второй запрос принимает ответ об успешном выполнении, я сохраняю его в базе данных и выполняю некоторые действия, если он принимает неуспешный (полный) ответ, запрос следует повторить. Мне нужно перестать повторять второй запрос, когда количество попыток будет больше 3. Как я могу это сделать?

     return firstRequestSenderService.send(request)
        .flatMap(resp -> {
          AtomicInteger attempts = new AtomicInteger(0);
          String url = normalizeUrl(resp.getResult());
          return Mono.defer(() -> {
            log.info("Second request, attempt = {}, params = {}", attempts.get(), param);
            return secondRequestSenderService.send(param, url, attempts.getAndIncrement());
          })
              .filter(this::isCompleteResponse)
              // i try .filter(b -> attempts.get() > 2)
              .doOnNext(r -> log.info("Save report"))
              .map(secondResp -> dataSaver.saveReport(param, secondResp))
              .doOnNext(r -> log.info("Send request to another service"))
              .flatMap(r -> secondRequestSender.sendPdf(r)))
              .doOnNext(bytes -> dataSaver.saveAnotherReport(param, bytes))
              .repeatWhenEmpty(req -> Flux.interval(Duration.ofSeconds(5)));
// also try   .repeatWhenEmpty(3, req -> Flux.interval(Duration.ofSeconds(5)));
        })
        .then(Mono.empty());

1 Ответ

0 голосов
/ 18 апреля 2020

проверка реактор-аддоны вы можете сделать что-то подобное

    return firstRequestSenderService.send(request)
        .flatMap(resp -> {
          return secondRequestSenderService
                  .send(param, url, attempts.getAndIncrement())
                  .retryWhen(Retry.any()
                          .randomBackoff(Duration.ofMillis(100), Duration.ofMillis(5000))
                          .retryMax(3));

        });

также вы можете сделать это с помощью повторных попыток активной зоны реактора RetryBackoffSpe c вы будете получите это, когда вы используете последний весенний webflux

  RetryBackoffSpec retryBackoffSpec = Retry
        .fixedDelay(3, Duration.ofSeconds(5));
return firstRequestSenderService.send(request)
        .flatMap(resp -> {
                  return secondRequestSenderService
                          .send(param, url, attempts.getAndIncrement())
                          .retryWhen(retryBackoffSpec);
                });
...