#java #servlets
Вопрос:
Для таких фреймворков, как Node.js и ASP.NET По сути, они способны асинхронно обрабатывать запросы для задач ввода-вывода без создания дополнительных потоков. Способны ли контейнеры сервлетов java также выполнять это? Если нет, то ожидают ли контейнеры java-сервлетов выполнения задач ввода-вывода в потоке до тех пор, пока запрос не будет полностью обработан?
Комментарии:
1. Я не уверен насчет контейнеров сервлетов, но я бы предположил, что большинство из них используют подход «поток за запрос». Однако существуют фреймворки, такие как Vert.x, которые работают очень похоже на Node.js и т.д.
Ответ №1:
Ладно, я сам нашел ответ.
Согласно документации Jakarta EE 9,:
Существует два распространенных сценария, в которых поток, связанный с запросом, может бездействовать.
- Поток должен дождаться, пока ресурс станет доступным, или обработать данные, прежде чем создавать ответ. Например, приложению может потребоваться запросить базу данных или получить доступ к данным из удаленной веб-службы, прежде чем генерировать ответ.
- Поток должен дождаться события, прежде чем генерировать ответ. Например, приложению может потребоваться дождаться сообщения Jakarta Messaging, новой информации от другого клиента или новых данных, доступных в очереди, прежде чем генерировать ответ.
Эти сценарии представляют собой блокирующие операции, которые ограничивают масштабируемость веб-приложений. Асинхронная обработка относится к назначению этих операций блокировки новому потоку и перенастройке потока, связанного с запросом, немедленно в контейнер.
Итак, контейнеры сервлетов java способны к асинхронной обработке. Однако они создадут новый поток как для задач ввода-вывода, так и для задач привязки процессора, что отличается от той же модели, что и Node.js и ASP.NET Ядро.