Асинхронная функция в сервлетах - PullRequest
0 голосов
/ 09 июля 2019

Я просто возвращался к Servlet-3.x функциям и изучал их. Если я не ошибаюсь, до Servlet-3.x это была модель потока на запрос, и в пуле не хватало потоков для интенсивного входящего трафика.

Итак, в Servlet-3.x он говорит, что он асинхронный и не держит потоки заблокированными, скорее освобождает их немедленно, но только задача делегируется.

Вот моя интерпретация,

считают, что в пуле потоков сервера 2 потока

Для нового запроса асинхронного сервлета R1 существует поток T1, этот T1 делегирует задачу T2 и T1 немедленно отвечает клиенту.

Вопрос: Создан ли T2 из пула потоков сервера? Если так, я не понимаю.

  • Случай 1: Если бы это был старый запрос синхронного сервлета T1 был бы занят выполнением задачи ввода-вывода,

  • Случай 2. Если это был асинхронный вызов сервлета, T2 занят выполнением задачи ввода-вывода.

  • В обоих случаях один из них занят.

Я попытался проверить то же самое с помощью образца сервлета Async на сервере приложений openliberty, ниже приведен пример журнала, полученный из моего демонстрационного сервлета.

Entering doGet() == thread name is = Default Executor-thread-116
Exiting doGet() == thread name is = Default Executor-thread-116
=== Long running task started ===
Thread executing @start of long running task = Default Executor-thread-54
Thread executing @end of long running task = Default Executor-thread-54
=== Long running task ended ===

Как показано выше, Default Executor-thread-116 немедленно освобождается и делегирует долго выполняющуюся задачу Default Executor-thread-54, но я не уверен, принадлежат ли они к пулу потоков сервера приложений. Если так, то почему бы просто не Default Executor-thread-116 выполнить задачу вместо делегирования?

Может ли кто-нибудь пролить свет на это асинхронное поведение сервлетов в JavaEE

1 Ответ

0 голосов
/ 10 июля 2019

В вашем примере, когда работа является синхронной и нет отдельного исполнителя / пула потоков, почти нет смысла использовать асинхронные сервлеты. Множество примеров / примеров - это просто блок во 2-м потоке, потому что они пытаются проиллюстрировать только синтаксис.

Но нет причины, по которой вы не можете раскрутить поток, чтобы выполнить небольшую работу, добавить свой асинхронный контекст в некоторый список, а затем после некоторого события (входящий JMS, websocket и т. Д.) Предоставить данные, необходимые для завершения асинхронный ответ. Например, игровой сервер на 2 игрока не будет ждать игрока 2 во втором потоке, он просто будет иметь свой асинхронный контекст, плавающий в памяти, ожидая, когда второй игрок найдет его.

...