Я новичок в NIO, и я пытаюсь понять, как Jetty использует NIO.
Мое понимание того, как традиционные контейнеры сервлетов, использующие службу блокировки IO, имеют следующий вид:
- Прибывает запрос
- Для обработки запроса выделяется поток, и вызывается метод сервлета (
doGet
и т.д.) - Метод сервлета передается
InputStream
иOutputStream
- Метод сервлета читается из
InputStream
и записывается вOutputStream
-
InputStream
иOutputStream
в основном связаны с соответствующими потоками базовогоSocket
Что происходит при использовании разъема NIO? Я предполагаю следующее:
- Прибывает запрос
- Jetty использует NIO-коннектор и асинхронно буферизирует весь запрос
- После того, как запрос был прочитан, полностью оберните буфер в
InputStream
- Создайте пустой буфер ответа (завернутый в
OutputStream
) - Выделите поток и вызовите метод сервлета (
doGet
и т.д.), передав указанные выше потоки обертки. - Метод сервлета записывает в завершенный (буферизованный) поток ответов и возвращается из метода сервлета
- Jetty использует NIO для записи содержимого буфера ответа в базовый
SocketChannel
В документации Jetty я нашел следующее:
SelectChannelConnector - Этот коннектор использует эффективные буферы NIO с неблокирующей моделью потоков. Jetty использует Direct NIO-буферы и выделяет потоки только для соединений с запросами. Синхронизация имитирует блокировку для API сервлета, а любой незапланированный контент в конце обработки запроса обрабатывается асинхронно.
Я не уверен, что понимаю, что означает Synchronization simulates blocking for the servlet API
?