简介
关于Tomcat Connector 的结构可以参考Tomcat网络模型,这里主要说一下与Connector关联的线程池。
每个 Connector 需要关联一个线程池,每当 Connector 接收到请求时,需要交给线程池去处理。 Connector 可以关联共享的线程池,也可以创建私有的线程池。
共享线程池
Connector属于Service Container,多个Connector要想共享线程池,则线程池也应该配置在Service Container中,如下图所示
共享线程池配置上图中在Service Container中配置了两个线程池(请忽略参数值的合理性),分别命名为tomcatThreadPool-01和tomcatThreadPool-02,并将两个Connector都与tomcatThreadPool-01关联。Tomcat启动的时候,会分别创建两个线程池tomcatThreadPool-01和tomcatThreadPool-02,只是tomcatThreadPool-02线程池没有用上。这样两个Container就共享了一个tomcatThreadPool-01线程池。通过Tomcat自带的Manager页面和JConsole都可以印证这一点,如下图所示。
Tomcat自带的Manager页面 JConsole中的Connector和Executor 8057Connector的Executor 8077Connector的Executor在Connector的配置中一旦配置了executor属性,则该Connector所有与线程池有关的配置全都失效。通过Tomcat自带的Manager页面查看Max threads的值为-1,但是实际的配置是生效了的,也就是在Executor中配置的maxThreads是生效的,通过JConsole可以验证这一点,官网也对此给出了解释,如下图所示。
JConsole中的tomcatThreadPool-01线程池 官网给出的关于maxThreads=-1的解释私有线程池
Connector除了使用共有的线程池,也可以使用独自的线程池,配置方式如下图所示。
私有线程池配置通过Tomcat自带的Manager页面和JConsole都可以上图配置生效了,如下图所示。
通过JConsole查看Connector查看线程池 8057Connector的maxThreads为150 8077Connector的maxThreads为180 总结
Tomcat每个Connector都需要关联一个线程池,可以是几个Connector共享一个,也可以是每个Connector独自使用一个。至于线程池具体的参数配置,需要根据实际情况来设置,不在本文讨论范围之内。
网友评论