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

文章首发地址

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

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

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

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

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

相关推荐
Joolun商城源码_Java2 小时前
Java 商城技术栈怎么选:单体、微服务还是前后端分离多端?
java·开发语言·微服务
拒绝内耗。2 小时前
一个请求进入 Java 应用后,怎么找到我们写的方法?
java·开发语言
夕除2 小时前
redis--013
java·开发语言
码匠许师傅2 小时前
【设计模式精讲】28.访问者模式(Visitor)
java·设计模式·访问者模式
麻瓜code3 小时前
【LeetCode】两数相加:模拟加法竖式,用进位 flag 一次遍历解决
java
zzzll11114 小时前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
lhldsg11 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都11 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒11 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
辰烨chenye11 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode