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

这篇具有很好参考价值的文章主要介绍了为什么Tomcat的NIO在读取body时要模拟阻塞?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

到了这里,关于为什么Tomcat的NIO在读取body时要模拟阻塞?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在Java中使用FileReader.read()进行读取文件时,为什么乱码?两个方法解决

     以上代码是有可能出现代码输出混乱的情况的,输出效果如下: 可能会出现乱码的问题: 原因可能是文件编码与程序读取时使用的编码不一致。在创建 FileReader 对象时,没有指定文件的编码格式,因此默认使用的是系统默认的编码格式。如果文件中包含非系统默认编码格式

    2024年02月03日
    浏览(38)
  • 为什么Flink-CDC读取Decimal等数值类型变成了非数值字符串

    每遇到一个问题,在经过努力研究明白之后,总想写点东西记录。怎奈又没这个好习惯,过了一两天这个激情就没了,想写也写不出来了。最近在做一个flink-cdc采集数据的测试和产品化开发,遇到一个数据转换的问题,折腾了我两个早上,有些心血来潮,就记录一下吧,对我

    2023年04月09日
    浏览(41)
  • 字节二面:为什么SpringBoot的 jar 可以直接运行?我说因为内嵌了Tomcat容器,他让我出门左转。。

    在传统的Java应用程序开发和部署场景中,开发者往往需要经历一系列复杂的步骤才能将应用成功部署到生产环境。例如,对于基于Servlet规范的Java Web应用,开发完成后通常会被打包成WAR格式,然后部署到像Apache Tomcat、Jetty这样的Web容器中。这一过程中,不仅要管理应用本身的

    2024年04月08日
    浏览(30)
  • 【C&C++】为什么 scanf 函数在读取字符串时不需要用取地址运算符 &

    在C语言中,字符串实际上是字符数组,所以我们可以使用 scanf 函数来读取字符串。但是,需要注意的是, scanf 在读取字符串时会在遇到空格、制表符或换行符时停止。因此,它不能用于读取包含空格的字符串。 以下是使用 scanf 读取字符串的基本示例: 在这个例子中,我们

    2024年01月20日
    浏览(37)
  • Netty为什么高效,为什么这么受欢迎?

    上篇文章通过 Java NIO 的处理流程与 Netty 的总体流程比较,并结合 Netty 的源码,可以更加清晰地理解Netty。本文将结合源码详细解析Netty的高效和强大功能的设计原理,学习 Netty 是如何实现其卓越的性能和功能特性,也希望可以在日后工作中利用到 Netty 的设计思想。 我们先看

    2024年02月12日
    浏览(57)
  • Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

    一、Redis是什么 Redis 是一种 基于内存的数据库 ,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于 缓存,消息队列、分布式锁等场景 。         Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、

    2024年02月10日
    浏览(52)
  • AIMD 为什么收敛(tcp reno/cubic 为什么好)

    TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图: 虽然只展示了两条流的收敛,但 n 条流收敛的展示无非就是将

    2024年02月06日
    浏览(63)
  • tcp 为什么要三次握手,两次不行吗?为什么?

    TCP使用三次握手(Three-Way Handshake)的过程是为了确保双方建立起可靠的通信连接,并在连接的建立过程中协商必要的参数。两次握手是不够的,原因主要有以下几点: 防止已失效的连接请求被接受: 假设有A和B两台主机,A向B发送了一个连接请求,但由于某些原因导致连接建

    2024年02月20日
    浏览(50)
  • 为什么美国加息,会让硅谷银行破产?美联储为什么要加息?

    所有回答由 AI 生产 答 : 美国加息会导致国债利率上升,此时购买国债的银行获得的利息收益会比利率较低时少,因此国债的市场价格就会下降,从而导致银行持有的这些国债资产减值。 答 : 美国加息意味着美国央行(即联邦储备委员会)将提高其官方基准利率,这意味着

    2023年04月23日
    浏览(51)
  • 为什么用python做人工智能,为什么人工智能用python

    大家好,给大家分享一下python人工智能为什么放到最后才学,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! Source code download: 本文相关源码 一、为何人工智能(AI)首选Python? 读完这篇文章你就知道了。我们看谷歌的TensorFlow基本上所有的代码都是C++和Python,

    2024年02月22日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包