Совершайте одновременные вызовы WebClient и получайте только первый завершенный

Я совсем новичок в 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
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
624
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте оператор 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() — это именно то, что мне нужно.

Apollo 15.12.2020 14:54

Другие вопросы по теме