Задать вопрос
Olegatorapp
@Olegatorapp
Java/Android dev

Как выполнить асинхронно часть метода?

Опишу сразу структуру с которой имеем дело:
1. Есть асинхронный контроллер (с выделенным THREAD_POOL_EXECUTOR) возвращающий CompletableFuture.
2. Внутри этого контроллера выполняется логика и в середине этого выполнения необходимо отправить, например, 5 http запросов, получить их результат и продолжить выполнять логику контроллера.

Есть проблема именно в месте, где отправляются эти запросы - выполняется очень медленно всё.

Отправка вот:
RequestSendManager manager = new RequestSendManager();
            DeferredResult<Map<BaseProtocol, RequestData>> res = manager
                .sendToPool(dspDatas);
            Map<BaseProtocol, RequestData> result =
                (Map<BaseProtocol, RequestData>) res.getResult();


Как можно в этом месте сделать это асинхронно, не блокируя этим действием основной поток обработки, т.к. в этот момент приходят ещё запросы в этот контроллер и поток надо временно освободить, пока не будет получен результат из этих http ответов и продолжить выполнение логики?
  • Вопрос задан
  • 400 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
Olegatorapp
@Olegatorapp Автор вопроса
Java/Android dev
Кому интересно, то проблема решена следующим образом:
ExecutorService pool = Executors.newFixedThreadPool(dspMap.size());
            List<Callable<BaseProtocol>> todo = new ArrayList<>(5);
dspMap.forEach((name, httpRequest) -> {
                todo2.add(() -> httpRequest.send());
 });
            try {
                List<Future<BaseProtocol>> res = pool.invokeAll(todo2);

                res.forEach(v -> {
                        //тут в res лежат уже все ответы, а время на выполнение всех запросов будет таким, 
                       //сколько займёт самый долгий ответ
                });
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Dmtm
Android
почему запросы выполняются в контроллере а не в самом CompletableFuture?
примерно так:
CompletableFuture.supplyAsync(...)
.exceptionally(....)
.thenApply(....)
.thenAccept(....);
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы