@turdubekov
Студент

Почему ArrayList пустой?

У меня есть асинхронный запрос, хочу полученный ответ записать в ArrayList, но у меня почему-что выдает пустой лист.
в чем может быть проблема?
мой код:
public List<Response> getAdditionalData(List<ExcelModel> excelList) throws InterruptedException {
        List<Response> responseList = new ArrayList<>();
        for (ExcelModel excel : excelList) {
            Mono<Response> response = webClient.get()
                    .uri(sybase + excel.getTransactionID())
                    .retrieve()
                    .bodyToMono(Response.class);
            response.subscribe(responseList::add);
        }

        log.info("list size size: {}", responseList.size());
        responseList.forEach(System.out::println);
        return responseList;
    }
  • Вопрос задан
  • 139 просмотров
Решения вопроса 2
@Akela_wolf
Extreme Programmer
Так запрос же асинхронный. То есть вы его запускаете и говорите "вот когда данные придут - запиши их в список". И не дожидаясь пока запрос выполнится - возвращаете список (который, разумеется, пустой - запрос же еще в процессе выполнения).

Поэтому, если уж вы начали использовать асинхронные запросы - надо жить в асинхронном мире дальше, везде протаскивая Mono и Flux.

Либо переходить на Kotlin с его корутинами (которые прекрасно интегрируются с Mono/Flux)
Ответ написан
Комментировать
xez
@xez Куратор тега Java
TL Junior Roo
Тут я вижу два варианта.
1. Вы никакой асинхронщины не хотите, но вам попался асинхронный клиент. Тогда нужно что-то типа такого сделать:
public List<Response> getAdditionalData(List<ExcelModel> excelList) {
        return Flux.fromIterable(excelList) // Превращаем лист во флюкс
                .flatMap(excel -> webClient.get()  // по каждому элемену делаем асинхронный запрос
                        .uri(sybase + excel.getTransactionID())
                        .retrieve()
                        .bodyToMono(Response.class))
                .collectList() // Собираем поток в лист. Тут получается Mono<List<Response>>
                .block(); // Блокируем тред и ждем завершения. Можно в скобочках указать сколько ждать.
    }


2. Либо вы пересаживаетесь на асинхронный стек, тогда вам нужно флюкс и отдавать, как и написал Михаил. И подписка на него дожна быть, скорее всего, где-то выше по стеку.
public Flux<Response> getAdditionalData(List<ExcelModel> excelList) {
        return Flux.fromIterable(excelList)
                .flatMap(excel -> webClient.get()
                        .uri(sybase + excel.getTransactionID())
                        .retrieve()
                        .bodyToMono(Response.class));
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
24 апр. 2024, в 13:10
400000 руб./за проект
24 апр. 2024, в 13:01
5000 руб./за проект
24 апр. 2024, в 13:00
3000 руб./за проект