Не рекомендуется ждать завершения запроса http
за 5 минут, а также ждать завершения отдельного процесса.Я предполагаю, что ваша конечная точка - synchronized
(не async
сопоставление запроса), так как вы не предоставили детали сопоставления.
Если вы запустите отдельный процесс и пока не отключите или не отключите его явно, этот определенный процесс будет запущен (если этот процесс завис).Обратитесь к этому вопросу , чтобы понять, как завершить процесс, а также к этому документу.
Как я уже сказал, запрос http
ожидает 5минуты не очень хорошая практика.Я предлагаю другой подход к этому решению, так как вы используете Spring Boot.Вы можете просто указать конечную точку asynchronous
, используя аннотацию @Async
, чтобы не ждать запроса до завершения процесса.( How To Do @Async весной - хороший документ, который можно увидеть в этом случае)
Теперь вы можете изменить реализацию контроллера для использования посредника сообщений (RabbitMQ, ActiveMQ, JMS и т. Д.далее) ставить запросы в очередь и немедленно отвечать клиенту ( Обмен сообщениями с RabbitMQ ).Итак, ваш клиент (браузер) сразу увидит ответ, даже без запуска процесса.Вы можете обработать ответ на стороне клиента так, как хотите.
Теперь вы можете написать другую программу для dequeue
сообщений от брокера и запустить отдельный процесс.Не имеет значения, сколько времени займет этот процесс, так как мы уже дали ответ клиенту, и вам не нужно уничтожать процесс, пока этот процесс не будет завершен (если он завис, просто убейте процесс и отправьте сообщение re-queue
очередь. Таким образом, мы можем гарантировать, что каждый запрос будет обработан).
После завершения процесса вы можете уведомить клиента посредством push-уведомления или реализации Websocket с полученными данными.
Я знаю, что это может быть слишком сложной задачей.Но если вы хотите сохранить надежность и удобство использования вашей функции, это стоит сделать.Также вы можете использовать это в микросервисной архитектуре.На самом деле это концепция микросервисов.Вот хорошая статья, чтобы узнать о этом подходе .