Tomcat长连接源码解析

长连接:

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

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

       BIO伪代码如下


    keepAlive = true

     while (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,那么设置成false
            prepareRequest();
            //当前socket连接能够处理的最大请求数,如果设置成1,那么也改成false,因为你设置成1,说明他只能处理一个请求,那么处理完就应该关闭
            if (maxKeepAliveRequests == 1) {
                keepAlive = false;
            } else if (maxKeepAliveRequests > 0 &&
                socketWrapper.decrementKeepAlive() <= 0) {
            //如果请求数有多个,但是超过了当前socket连接上设置的最大限制数,那么keepAlive也设置成false
                keepAlive = 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设置成false
       if (tokens.contains(Constants.CLOSE)) {
            keepAlive = false;
        } 
        //keep-alive设置成true
        else 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中保持长连接以及会影响到长连接开关的因素

          

                

相关推荐

  1. Tomcat连接

    2024-07-18 08:08:02       20 阅读
  2. SpringBoot

    2024-07-18 08:08:02       55 阅读
  3. ConcurrentHashMap

    2024-07-18 08:08:02       63 阅读
  4. SharedPreferences

    2024-07-18 08:08:02       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 08:08:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 08:08:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 08:08:02       57 阅读
  4. Python语言-面向对象

    2024-07-18 08:08:02       68 阅读

热门阅读

  1. 华为欧拉openEuler24.03 rpm安装 MySQL8.4

    2024-07-18 08:08:02       24 阅读
  2. 深入解析Apache Hive架构

    2024-07-18 08:08:02       23 阅读
  3. strncpy 和 snprintf 的区别

    2024-07-18 08:08:02       22 阅读
  4. Kafka系列之:Kafka存储数据相关重要参数理解

    2024-07-18 08:08:02       17 阅读
  5. Oracle(8)什么是Oracle实例(Instance)?

    2024-07-18 08:08:02       22 阅读
  6. python 迭代器介绍 map() 函数

    2024-07-18 08:08:02       19 阅读
  7. Linux chmod 命令简介

    2024-07-18 08:08:02       24 阅读
  8. QT+winodow 代码适配调试总结(三)

    2024-07-18 08:08:02       21 阅读
  9. 代码随想录学习 54day 图论 A star算法

    2024-07-18 08:08:02       16 阅读
  10. Windows中配置Python 3.11环境安装教程

    2024-07-18 08:08:02       22 阅读
  11. 灵动微单片机SPI LCD彩屏方案优势

    2024-07-18 08:08:02       22 阅读