Tomcat的Connector组件

    上一次画了一个Tomcat的启动序列图,了解了tomcat的主要组件和启动顺序,今天着重了解一下Connector组件。

   Tomcat各个组件的实例化都是在Catalina类的初始化过程中完成的,然后启动各个组件。这里从Connector的start()方法开始。

connector.start()方法里面创建了一个CoyoteAdapter对象,这个对象负责处理请求;然后把CoyoteAdapter对象关联到ProtocolHandler,

          adapter = new CoyoteAdapter(this);

         protocolHandler.setAdapter(adapter);

其中,protocolHandler对象是在Connector对象创建的时候创建的,初始化代码在Connector的构造函数,相关代码如下

          protected String protocolHandlerClassName =  "org.apache.coyote.http11.Http11Protocol";

         Class clazz = Class.forName(protocolHandlerClassName);
         this.protocolHandler = (ProtocolHandler) clazz.newInstance();

接着调用了protocolHandler 的init()方法和start()方法,到此Connector启动完成。下面具体看protocolHandler 对象如何初始化和启动。

Http11Protocol里面有一个对象是JIoEndpoint endpoint = new JIoEndpoint(),负责处理TCP连接。

Http11Protocol包含一个内部类:Http11ConnectionHandler,这个内部类使用Http11Processor处理Socket连接。

           在Http11Protocol的init()方法里面,给endpoint 设置处理器Http11ConnectionHandler和一个socket工厂类,然后执行endpoint对象的init()方法,该方法主要是从socket工厂类获取一个ServerSocket对象,既 serverSocket = serverSocketFactory.createSocket(port, backlog);

            在Http11Protocol的start()方法里面,主要是调用endpoint对象的start()方法来启动线程接收Socket连接。当接收到一个socket连接后,就创建一个Worker线程来处理这个socket,这个Worker线程的run()方法里面调用Http11ConnectionHandler的process()方法创建了Http11Processor对象来处理这个socket请求,具体的处理过程就在Http11Processor的process()方法,在这个方法里面,创建了Request对象,代表请求消息,Response对象表示响应;从socket输入流里面读取HTTP请求,然后解析请求行,请求头;然后通过一些过滤器处理请求头;接着执行adapter.service(request, response);处理请求;


这一步,具体里面实现,下次再看,代码确实很多。


### 配置 Tomcat Connector 并自定义 `tomcatThreadPool` 线程池参数 #### 修改 server.xml 文件 为了配置 Tomcat 的线程池,需要编辑位于 `$CATALINA_HOME/conf/` 目录下的 `server.xml` 文件[^1]。 在 `<Service>` 标签内,但在任何 `<Connector>` 标签之前,添加如下所示的 Executor 定义: ```xml <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="200" /> ``` 上述 XML 片段创建了一个名为 `tomcatThreadPool` 的执行器实例,并指定了最大线程数 (`maxThreads`) 和最小备用线程数 (`minSpareThreads`)。这有助于管理用于处理客户端请求的工作线程的数量[^2]。 对于更详细的线程池配置选项,可以考虑以下附加参数: - **`maxIdleTime`**: 设置空闲线程的最大存活时间为 300,000 毫秒 (即 5 分钟)。 - **`prestartminSpareThreads`**: 如果希望在线程池启动时预先创建指定数量的线程,则可设置此属性为 true[^5]。 - **`maxQueueSize`**: 控制等待队列的最大长度,超出该数值的新请求将会被拒绝服务。 #### 调整 Connector 组件以利用线程池 为了让特定的 HTTP 连接处理器能够使用上面定义好的线程池,需在其对应的 `<Connector>` 元素中加入 executor 属性指向所定义的名字: ```xml <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="tomcatThreadPool"/> ``` 这里通过设定 `executor="tomcatThreadPool"` 来关联先前声明过的线程池资源。 #### 关于连接数与线程模型的选择 需要注意的是,`maxConnections` 参数的具体值取决于使用的 I/O 处理方式(BIO 或 NIO),以及服务器硬件性能等因素。通常情况下,在采用 BIO 方式的场景下,应使 `maxConnections` 接近甚至等于 `maxThreads`;而在基于 NIO 实现的情况下,允许更高的 `maxConnections` 值来适应更多的并发连接请求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值