为什么Tomcat的NIO在读取body时要模拟阻塞?

文章首发地址

Tomcat的NIO完全可以以非阻塞方式处理IO,为什么在读取body部分时要模拟阻塞呢?在Tomcat的NIO读取HTTP请求时,为了保证请求的正确性和可靠性,需要模拟阻塞模式,这是因为servlet规范里定义了ServletInputStream在读数据时是阻塞模式。

ServletInputStream在读取数据时是阻塞模式,是因为Servlet容器需要保证请求的完整性和顺序性。在HTTP协议中,请求分为请求头和请求体两部分,其中请求体可能会比较长。如果ServletInputStream是非阻塞的,那么在读取请求体时,会出现部分数据读取到了,部分数据没有读取到的情况,这样会导致请求的不完整,可能会影响后续的业务处理。

另外,Servlet容器需要保证请求的顺序性,即先到先处理。如果ServletInputStream是非阻塞的,那么在读取请求体时,可能会出现多个请求的数据混淆在一起的情况,这样会导致请求的顺序被打乱,可能会影响后续的业务处理。

因此,为了保证请求的完整性和顺序性,Servlet规范规定ServletInputStream在读取数据时必须是阻塞模式。

具体来说,Tomcat的NIO会将读取请求体的过程分为多个步骤,每次读取一部分数据,然后判断是否已经读取完整个请求体,如果没有则等待一段时间再继续读取。这种方式可以有效保证请求的正确性和可靠性,同时也避免了使用阻塞模式可能带来的性能问题。

相关推荐
cherryc_12 分钟前
JavaSE基础——第十二章 集合
java·开发语言
wgb040917 分钟前
vxe table 升级之后页面数据不显示解决方法
java·前端·javascript
May’sJL19 分钟前
Redis高可用-主从复制
java·redis·缓存
无敌最俊朗@31 分钟前
SQlite:电影院售票系统中的主键(单列,复合)约束应用
java·开发语言·数据库
行思理39 分钟前
macos 如何清空IntelliJ IDEA安装记录
java·macos·intellij-idea
信码由缰1 小时前
Java 运行时安全:输入验证、沙箱机制、安全反序列化
java
Dying.Light1 小时前
Java基础复习-中-集合
java
Felicity_Gao1 小时前
uni-app 开发APP应用媒体处理与文件管理功能
java·uni-app·媒体
永远有缘2 小时前
四种编程语言常用函数对比表
java·开发语言·c++·python
C++_girl2 小时前
c++、java/python语言有什么区别?为什么c++更快?
java·开发语言·c++