Я новичок в 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?