Tomcat Connector 和线程池(Executor)的关系

关于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都可以印证这一点,如下图所示。

在Connector的配置中一旦配置了executor属性,则该Connector所有与线程池有关的配置全都失效。通过Tomcat自带的Manager页面查看Max threads的值为-1,但是实际的配置是生效了的,也就是在Executor中配置的maxThreads是生效的,通过JConsole可以验证这一点,官网也对此给出了解释,如下图所示。

? Connector除了使用***有的线程池,也可以使用独自的线程池,配置方式如下图所示。

通过Tomcat自带的Manager页面和JConsole都可以上图配置生效了,如下图所示。

Tomcat每个Connector都需要关联一个线程池,可以是几个Connector***享一个,也可以是每个Connector独自使用一个。至于线程池具体的参数配置,需要根据实际情况来设置,不在本文讨论范围之内。