Я совсем новичок в webflux и хочу сделать следующее: Я хочу делать параллельные HTTP-запросы к одному и тому же URL-адресу с разными значениями параметров и останавливаться, когда я получаю первый не нулевой (и не исключительный) результат. Беру пример отсюда https://www.baeldung.com/spring-webclient-simultaneous-calls но я понятия не имею, как остановиться, когда я получил результат. Кто-нибудь может мне помочь? В настоящее время у меня есть что-то вроде этого:
RetrySpec retrySpec = Retry.max(3);
return webClient.get().uri("/getMyObject/{id}", id)
.retrieve()
.bodyToMono(MyObject.class)
.retryWhen(retrySpec);
}
public Flux<> getMyObjs(List<String> ids) {
return Flux.fromIterable(ids)
.parallel(Runtime.getRuntime().availableProcessors())
.runOn()
.flatMap(this::getMyObject)
.;//// Stop when I get first non exceptional value
}
Попробуйте оператор next() во Flux.
public Mono<MyObject> getMyObjs(List<String> ids) {
return Flux.fromIterable(ids)
.parallel(Runtime.getRuntime().availableProcessors())
.runOn()
.flatMap(this::getMyObject)
.next();// Emit only the first item emitted by this Flux, into a new Mono. If called on an empty Flux, emits an empty Mono.
}
Ссылка: https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#next--
Однако проверьте также оператор firstWithSignal и firstWithValue. https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#firstWithSignal-java.lang.Iterable-https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#firstWithValue-java.lang.Iterable-
Когда у меня возникает такая проблема, я обычно проверяю документацию, чтобы найти подходящего оператора в Flux API.
Спасибо, Нипуна, next() — это именно то, что мне нужно.