Задать вопрос
@turdubekov
Студент

Как решить вопрос ожидания в асинхронном программировании?

Вкратце:
1. Принять Excel файл и спарсить
2. спарсенные данные записать в ArrayList<Object>
3. отправлять асинхронные http запросы в API №1 (Используется WebClient с неблокирующим потоком)
3.1 полученные данные из API №1 обратно записать в ArrayList
3.2 если API №1 не вернул данные, то постучится в API №2 и записать в полученные данные обратно в ArrayList
4. ArrayList записать в Excel файл и выдать обратно

Проблема: Пока данные приходят и записываются в ArrayList проходит слишком много времени (3-7 минут)
По этой причине когда мне отправляет Excel из фронта они ловят 502 time out не дожидаясь ответного файла.
Вопрос: как можно решить данную проблему?

P.s используемые инструменты: Java, Spring boot.
  • Вопрос задан
  • 265 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@Akela_wolf
Extreme Programmer
Тут проблема не в асинхронном коде, а в том что обработка ваших данных занимает слишком много времени. Если бы у вас обработка данных была синхронной - была бы та же проблема.

Таким образом, у вас 2 варианта:
1. Увеличить таймаут на nginx (или кто там отвечает 502 Gateway timeout), чтобы он ждал ответа 10 минут. Пользователю при этом тоже придется ждать. На фронте в это время можно рисовать "крутилку" или запустить прямо в браузере тетрис :)
2. Делать общение с фронтом асинхронным тоже. Пользователь загружает файл, файл уходит в обработку и фронту сразу же возвращается 200 OK + идентификатор задачи. Фронт с определенной периодичностью (10-30 секунд) опрашивает по идентификатору бэк "ну что, закончилась обработка?". И как только закончилась - бэк ему отдает итоговый файл. Пока обработка не закончилась - бэк может отдавать данные о количестве обработанных записей, что позволит фронту рисовать прогресс-бар, например.
2а. Тоже самое что и в п.2, но уведомление о завершении задачи посылает бэк через WebSocket.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
Нужно реализовать асинхронное выполнение и на стороне пользователя тоже.
Сделайте что-то типа "заданий".
Пользователь загружает файл - создается "задание". Пользователь может зайти в какой-то список заданий и посмотреть их прогресс. Когда задание выполнено - пользователь должен получить возможность выгрузить результаты.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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