Использование Spring MVC У меня есть контроллер, который делает запрос API внешней службе, которая может занять много времени. Я делаю это синхронно, потому что хочу вернуть результат внешнего запроса пользователю. В идеале это не блокирует целую цепочку за это время, вроде как асинхронный/ожидающий идиом стиля C#, но я не уверен, как это сделать с Spring (или что-то еще).Обработка длинных процессов в Spring MVC-контроллерах
ответ
Вы можете использовать аннотацию @Async для некоторого метода обслуживания для асинхронного выполнения.
Spring MVC построен на вершине сервлета, это означает, что (по умолчанию) все, что вы делаете внутри метода Controller, блокирует поток запросов, предоставляемый Tomcat (Tomcat является контейнером сервлетов по умолчанию для Spring Boot в наши дни). Если вы вызываете другую службу на основе HTTP или запрашиваете базу данных внутри вашего контроллера, вы, вероятно, блокируете IO-вызов. Блокировка вызовов всегда будет блокировать вызывающий поток, асинхронный/ожидающий в C# - это просто синтаксический сахар, например, Springs @Async использует скрытую ThreadPool для выполнения реальной работы.
Если вы не можете вызвать службу восходящего потока с помощью селектора NIO, вам понадобится поток, ожидающий ответа, и в этом случае имеет смысл просто блокировать поток потока Tomcat, я считаю, что по умолчанию количество потоков запросов - 150, но при необходимости вы можете установить его выше. Если восходящую службу можно вызвать с помощью NIO, вам нужен только один поток для всех вызовов этой службы, и вы можете вернуть DeferedResult
с вашего контроллера и написать ответ клиенту, как только ответ от восходящей службы будет были произведены.
Это просто. Не вызывайте длинный api из вашего основного метода контроллера. Просто верните представление (JSP). Затем вы можете запустить запрос ajax из вашего метода document.ready
в вашем представлении (Javascript). Вы можете иметь отдельный обработчик @ResourceRequest
в вашем контроллере для обработки вызова ajax. Верните результат api (как JSON или что-то еще) для вызывающего абонента ajax. После того как представление получит ответ ajax, обновите пользовательский интерфейс по своему усмотрению.
- 1. ASP.NET C# и обработка длинных процессов
- 2. Обработка длинных отчетов
- 3. JMS - асинхронная обработка - обработка процессов родительского/дочернего процессов Зависимости
- 4. git diff - обработка длинных строк?
- 5. Задача таймера iPhone для длинных процессов
- 6. Pexpect + pxssh обработка длинных строк
- 7. Обработка многопоточных процессов
- 8. Обработка рабочих процессов Powershell
- 9. Многопроцессорная обработка дочерних процессов
- 10. Обработка длинных сроков выполнения страниц в ASP.NET
- 11. Обработка больших длинных значений в Matplotlib
- 12. Обработка длинных списков редактирования в XMLStarlet
- 13. Параллельная обработка большого количества процессов
- 14. Bash: Мониторинг и обработка процессов
- 15. Обработка длинных запущенных задач и API Parse.com
- 16. Обработка длинных запросов с помощью DropWizard
- 17. Angular2/RXJS - обработка потенциально длинных запросов
- 18. python gevent обработка длинных блокирующих операций
- 19. Обработка нескольких процессов в tcl/expect
- 20. Обработка процессов в функции обновления C#
- 21. Обработка нескольких дочерних процессов в node.js
- 22. Обработка тестовых рабочих процессов в R testthat
- 23. Пользовательские Обработка исключений/Обработка ошибок в Spring
- 24. Где я могу хранить PID для длинных дочерних процессов?
- 25. Объекты Spring Rho - хранение длинных строк
- 26. Обработка процессов Java Операции InputStream и OutputStream
- 27. Обработка ошибок в Spring MVC
- 28. Обработка исключений в Spring GenericFilterBean
- 29. Обработка содержимого */* в Spring Boot
- 30. Вилка, обмен переменных и обработка зомби-процессов
спасибо. К сожалению, AFAIK это приведет к асинхронной задаче в пуле потоков, и единственный способ вернуть результат в клиентский запрос - это cal get() в Будущем, который заблокирует поток запросов –