Jetty和其他容器如何在坚持Servlet规范的同时利用NIO?
我是NIO的新手,我正试图弄清楚Jetty如何利用NIO。
我对使用阻塞 IO 服务请求的传统 Servlet 容器的理解如下:
- 请求到达
- 分配一个线程来处理请求,并调用 servlet 方法( etc)
doGet
- Servlet 方法被赋予一个和
InputStream
OutputStream
- servlet 方法从 读取并写入
InputStream
OutputStream
- 和 基本上与底层的相应流相关联
InputStream
OutputStream
Socket
使用 NIO 连接器时有何不同?我的猜测大致如下:
- 请求到达
- Jetty 使用 NIO 连接器并异步缓冲整个请求
- 读取请求后,将缓冲区完全包装在
InputStream
- 创建一个空的响应缓冲区(包装在
OutputStream
) - 分配一个线程并调用 servlet 方法 ( etc) 来处理上述包装流
doGet
- Servlet 方法写入包装(缓冲)响应流,并从 servlet 方法返回
- Jetty 使用 NIO 将响应缓冲区内容写入底层
SocketChannel
从Jetty文档中,我发现了以下内容:
选择通道连接器 - 此连接器使用具有非阻塞线程模型的高效 NIO 缓冲区。Jetty 使用 Direct NIO 缓冲区,并且仅将线程分配给具有请求的连接。同步模拟 servlet API 的阻塞,请求处理结束时的任何未刷新内容都是异步编写的。
我不确定我是否理解同步模拟 servlet API 的阻塞
意味着什么?