当前位置: 首页 > news >正文

Tomcat长连接源码解析

长连接:

        客户端发送Http请求至服务端,请求发送完之后socket连接不断开,可以继续接收下一个Http请求并且解析返回。接手并解析这些Http请求的时候socket连接不断开,这种过程被称为长连接。

        需要注意的点就在于,在满足什么条件的情况下,Tomcat何时会保持长连接;何时又会将长连接断开。

       BIO伪代码如下

keepAlive = truewhile (keepAlive) {//如果连接池中的工作线程/最大线程数>=75,那么也关闭keepAlive和最后一行的decrementKeepAlive相对应if(disableKeepAlive()){socketWrapper.setKeepAliveLeft(0);}//如果是HTTP/1.1,那么依旧是true,如果是HTTP/1.0或者''那么将keepAlive设置成false,否则直接报错,Http协议有问题prepareRequestProtocol();//请求头中的Connection参数,如果是keep-alive,那么设置成true,如果是close,那么设置成falseprepareRequest();//当前socket连接能够处理的最大请求数,如果设置成1,那么也改成false,因为你设置成1,说明他只能处理一个请求,那么处理完就应该关闭if (maxKeepAliveRequests == 1) {keepAlive = false;} else if (maxKeepAliveRequests > 0 &&socketWrapper.decrementKeepAlive() <= 0) {//如果请求数有多个,但是超过了当前socket连接上设置的最大限制数,那么keepAlive也设置成falsekeepAlive = false;}}prepareRequestProtocol() {if (protocolMB.equals(Constants.HTTP_11)) {}else if (protocolMB.equals(Constants.HTTP_10)) {keepAlive = false;}else if (protocolMB.equals("")) {keepAlive = false;}}prepareRequest(){//close设置成falseif (tokens.contains(Constants.CLOSE)) {keepAlive = false;} //keep-alive设置成trueelse if (tokens.contains(Constants.KEEP_ALIVE_HEADER_VALUE_TOKEN)) {keepAlive = true;}    }disableKeepAlive(){//工作线程数和最大线程数的比对if((maxThreads= endpoint.getMaxThreadsWithExecutor()) > 0 && (threadsBusy = endpoint.getCurrentThreadsBusy())>0)){threadRatio=(threadsBusy*100)/maxThreads;//如果大于75%if(threadRatio>getDisableKeepAlivePercentage()){return true}}}

        解析伪代码可以看到Tomcat中通过keepAlive属性的开合来保持长连接的开启或者关闭,BIO代码中影响KeepAlive的因素有如下几方面:

                1.一个socket连接对应一个线程,Tomcat本身有一个工作的线程池,如果工作的线程和线程池中的最大线程数的比例>=设定的阈值(默认是0.75),那么就会就会将keepAlive设置成false

                2.会根据你的Http版本,1.0的设置成false

                3.Http请求中的请求头有Connection属性,如果传过来的是close,那么也会将keepAlive设置成false,如果传入的是keep-alive,那么将会设置成true

                4.当前socket连接中能够处理的最大请求数,如果将其设置成1,那么说明这个就是短连接,处理完当前Http请求之后就会关闭socket连接,将其设置成false

                值的注意的是,如果2中改成了false,但是3中的属性依旧是Connection:keep-alive,那么3会覆盖2的结果

                上述就是Tomcat中保持长连接以及会影响到长连接开关的因素

          

                

http://www.lryc.cn/news/403755.html

相关文章:

  • C++编程:实现一个跨平台安全的定时器Timer模块
  • PyTorch的自动微分模块【含梯度基本数学原理详解】
  • AI 绘画|Midjourney设计Logo提示词
  • LeNet实验 四分类 与 四分类变为多个二分类
  • 【BUG】已解决:java.lang.reflect.InvocationTargetException
  • 配置kali 的apt命令在线安装包的源为国内源
  • JAVA 异步编程(线程安全)二
  • Golang | Leetcode Golang题解之第260题只出现一次的数字III
  • IDEA自带的Maven 3.9.x无法刷新http nexus私服
  • 56、本地数据库迁移到阿里云
  • 新时代多目标优化【数学建模】领域的极致探索——数学规划模型
  • 单例模式详解
  • WebGIS主流的客户端框架比较|OpenLayers|Leaflet|Cesium
  • 【LabVIEW作业篇 - 2】:分数判断、按钮控制while循环暂停、单击按钮获取book文本
  • Kafka架构详解之分区Partition
  • SSM之Mybatis
  • Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)
  • 2024年7月12日理发记录
  • 几种常用排序算法
  • Spring3(代理模式 Spring1案例补充 Aop 面试题)
  • Github报错:Kex_exchange_identification: Connection closed by remote host
  • LabVIEW在CRIO中串口通讯数据异常问题
  • ALTERA芯片解密FPGA、CPLD、PLD芯片解密解密
  • [RK3588-Android12] 关于如何取消usb-typec的pd充电功能
  • 分布式 I/O 系统 BL200 Modbus TCP 耦合器
  • Java面试题--JVM大厂篇之Serial GC在JVM中有哪些优点和局限性
  • 【人工智能】机器学习 -- 贝叶斯分类器
  • 深入理解 React 的 useSyncExternalStore Hook
  • 河南萌新联赛2024第(一)场:河南农业大学
  • K8S 上部署 Emqx