Как реализовать Polling Logic в Project Reactor? - PullRequest
0 голосов
/ 10 июня 2019

У меня есть метод, который отправляет запрос на получение статуса задания и возвращает статус, это выглядит так:

Mono<JobStatus> getJobStatus() {...}

Объект JobStatus имеет метод JobStatus.isDone(), который возвращает информацию о том, выполнена ли ожидающая работа или нет.

Можно ли мне продолжать подписываться на моно, пока JobStatus.isDone() не станет правдой? то есть что-то вроде getJobStatus().keepSubscribingUntil(status -> status.isDone())

1 Ответ

2 голосов
/ 10 июня 2019

Один вариант будет для getJobStatus() Mono только для генерации, когда задание выполнено, что не всегда легко в зависимости от того, как в настоящее время реализовано Mono.

Для опроса, при условии, что Mono опрашивает каждый раз, когда вы подписываетесь на него вы можете использовать repeatWhen в паре с takeUntil:

getJobStatus()
    .repeatWhen(iter -> Mono.delay(Duration.ofMillis(pollDelay))) //(1)
    .takeUntil(JobStatus::isDone) //(2)
    .last() //(3)

(1) повторно подписываться на источник Mono (при этом Flux<JobStatus>)

(2) отменяет вышеуказанный цикл повторения, как только возвращенное состояние помечается как выполненное.

(3) переключается на Mono<JobStatus>который выдает статус последней итерации (то есть тот, который помечен как выполненный)

...