Асинхронная задача из сервлета Java - PullRequest
7 голосов
/ 02 марта 2011

Мне нужно выполнить асинхронную задачу при вызове конечной точки веб-службы RESTful.По сути, конечной точке предлагается выполнить основную часть работы с операцией POST.Он должен немедленно вернуть вызывающему абоненту 200 OK, создать поток и выполнить его ресурсоемкую задачу.По завершении поток затем отправит запрос POST в соответствующую конечную точку вызывающей стороны (другой сервер REST), что указывает на успешное выполнение (передача токена, представляющего начальный запрос транзакции).

Каковы оптимальные подходы для выполнения асинхронных действийвнутри сервлета, о котором я должен знать?

Ответы [ 4 ]

8 голосов
/ 02 марта 2011

Servlet 3.0 поддерживает асинхронные операции .Tomcat 7.0 уже стабилен, поэтому вы можете получить его и попробовать новые функции.

Если вам не нужно непрерывно выводить данные, а просто запустить фоновый процесс, вы можете использовать любой доступный асинхронный механизм.:

4 голосов
/ 02 марта 2011

Помимо сложностей асинхронного кодирования в Java, другой «наилучшей практикой» в веб-сервисах RESTful является использование кодов состояния HTTP для максимально точного описания ответа вашего сервера. Если у вас нет веских причин придерживаться 200 (т.е. клиент, которого вы не можете изменить, ожидает этого), вы должны вернуть HTTP 202 :

202 Принято

Запрос принят к обработке, но обработка не завершена.

1 голос
/ 02 марта 2011

Единственный совет для вашего сценария - использовать пул потоков, а не создавать новый поток для каждого запроса.В Java это очень просто, просто создайте пул один раз во время запуска приложения (посмотрите на Executors class) и отправляйте ему новые задачи каждый раз, когда вам нужно выполнить какую-то асинхронную операцию.Для вашего сценария эти задачи будут выполнять ресурсоемкие операции и повторный вызов REST из другого потока, задолго до того, как исходный запрос был обслужен с 200.

0 голосов
/ 02 марта 2011

В контейнере Java EE рекомендуется использовать API WorkManager (JSR-237). Проверьте эту статью для обзора.

Контейнер J2EE может обслуживать несколько пользователи одновременно (параллельно) управляя пулом потоков, но для различные причины открытия независимой потоки в одном контейнере J2EE не рекомендуется Некоторые контейнеры администраторы безопасности не позволят пользователю программы для открытия тем. Более того, если некоторые контейнеры разрешено открывать темы, то они бы не справились эти темы и, следовательно, нет управляемые контейнером услуги будут доступно для тем.

...