Я просто возвращался к 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