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

文章首发地址

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

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

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

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

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

相关推荐
Zephyr_021 小时前
Leedcode算法题
java·算法
苍煜21 小时前
Java开发IO零基础吃透:BIO、NIO、同步异步、阻塞非阻塞
java·python·nio
折哥的程序人生 · 物流技术专研21 小时前
Java面试85题图解版(一):基础核心篇
java·开发语言·后端·面试
AllData公司负责人1 天前
通过Postgresql同步到Doris,全视角演示AllData数据中台核心功能效果,涵盖:数据入湖仓,数据同步,数据处理,数据服务,BI可视化驾驶舱
java·大数据·数据库·数据仓库·人工智能·python·postgresql
Hello.Reader1 天前
算法基础(十)——分治思想把大问题拆成小问题
java·开发语言·算法
一只大袋鼠1 天前
JavaWeb四种文件上传方式(下篇)
java·开发语言·springmvc·javaweb
TE-茶叶蛋1 天前
深入研究 yudao-framework 模块:Java 编程能力提升指南
java·开发语言
逻辑驱动的ken1 天前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
兔小盈1 天前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
CeshirenTester1 天前
LangChain的工具调用 vs 原生Skill API:性能差在哪儿?
java·人工智能·langchain