Java L oop до тех пор, пока веб-клиент не вернет Mono. - PullRequest
0 голосов
/ 05 мая 2020

У меня есть код веб-клиента java, ответ которого я конвертирую в Mono. Я хочу повторять вызов api, пока ответ Mono не будет соответствовать определенному условию. Конечно, я не хочу повторяться до бесконечности. Я хочу повторять каждые 5 секунд до 30 секунд. Пока я пробовал это

client.get()
                .uri("https://someUri")
                .retrieve()

                .bodyToMono(Response.class)
                .delayElement(Duration.ofSeconds(5))
                .retryBackoff(5, Duration.ofSeconds(5))
                .delayUntil(r -> {
                    System.out.print("Looping"); 
                    if(condition) {
                        System.out.print(r.getStatus());
                        return Mono.just(r);
                    }
                    return Mono.empty();
                })

Но бесполезно.

1 Ответ

0 голосов
/ 05 мая 2020

Вы можете использовать фильтр, repeatWhenEmpty и Repeat, например,

client.get()
    .uri("https://someUri")
    .retrieve()
    .bodyToMono(Response.class)
    .filter(response -> condition)
    .repeatWhenEmpty(Repeat.onlyIf(r -> true)
        .fixedBackoff(Duration.ofSeconds(5))
        .timeout(Duration.ofSeconds(30)))

Класс Repeat является частью библиотеки response-extra

<dependency>
    <groupId>io.projectreactor.addons</groupId>
    <artifactId>reactor-extra</artifactId>
</dependency>
...