У меня есть служба REST, реализованная с помощью JAX-RS. Некоторые операции занимают много времени, возможно, 15–30 минут. В таких случаях я предпочитаю направить фоновый поток для обработки длительной операции, а затем немедленно ответить HTTP-статусом 202 ПРИНЯТО. Ответ будет содержать заголовок местоположения с URL-адресом, который клиенты могут использовать для опроса о ходе выполнения.
Этот подход требует создания потоков для обработки длительных операций, так что 202 ACCEPTED может быть возвращено немедленно. Я также знаю, что создание собственных потоков в контейнере Java EE, как правило, является плохой практикой!
У меня следующие вопросы:
- Согласны ли люди, что это правильный подход?
- Предполагая, что это правильно, могут ли люди порекомендовать решение «хорошей практики», которое позволяет мне выполнять длительную операцию в фоновом режиме и немедленно возвращаться?
Кроме того, чтобы не управлять собственными потоками, я изучил API асинхронного сервера JAX-RS. К сожалению, хотя это увеличивает пропускную способность сервера, это не позволяет мне сразу же ответить «ПРИНЯТО».
Джерси заявляет следующее:
Note that the use of server-side asynchronous processing model will not improve the
request processing time perceived by the client. It will however increase the
throughput of the server, by releasing the initial request processing thread back to
the I/O container while the request may still be waiting in a queue for processing or
the processing may still be running on another dedicated thread. The released I/O
container thread can be used to accept and process new incoming request connections.
Любая помощь приветствуется. Спасибо!