spring boot 中可通过 webserverfactorycustomizer 编程式定制内嵌 tomcat 的线程池和连接数,推荐使用 tomcatservletwebserverfactorycustomizer 实现强类型配置,支持动态参数注入与 http/https 分别定制,并可通过日志、actuator 或压测验证生效。

Spring Boot 中可以通过 WebServerFactoryCustomizer 编程式定制内嵌 Tomcat 的线程池和最大连接数,无需修改配置文件或侵入启动类。
使用 TomcatServletWebServerFactoryCustomizer 定制线程池
这是最直接、推荐的方式,适用于 Spring Boot 2.x 和 3.x(注意包路径差异)。核心是实现 WebServerFactoryCustomizer<tomcatservletwebserverfactory></tomcatservletwebserverfactory> 接口,在其 customize 方法中获取并配置 Tomcat 的 Connector。
- 通过
factory.getTomcat().getConnectors()获取 Connector 列表(通常只有一个) - 调用
connector.setProperty("maxThreads", "200")或直接 cast 为AbstractHttp11Protocol设置强类型属性 - 推荐使用强类型方式,避免拼写错误和类型不安全
示例代码:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
@Component
public class TomcatCustomizer implements WebServerFactoryCustomizer<tomcatservletwebserverfactory> {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addAdditionalTomcatConnectors(createHttpConnector());
factory.addAdditionalTomcatConnectors(createHttpsConnector()); // 可选:添加 HTTPS
// 自定义默认 HTTP connector
factory.addAdditionalTomcatConnectors(connector -> {
// 如果只想改默认 connector,更推荐下面这种写法:
});
// 更稳妥:遍历并修改默认 connector
factory.getTomcat().getConnectors().forEach(connector -> {
if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol> protocol) {
protocol.setMaxThreads(200);
protocol.setMinSpareThreads(20);
protocol.setMaxConnections(10000);
protocol.setAcceptCount(100); // 等待队列长度
protocol.setConnectionTimeout(20000); // ms
}
});
}
private Connector createHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setPort(8081);
connector.setUriEncoding("UTF-8");
return connector;
}
}</tomcatservletwebserverfactory>
通过 application.yml 配合 Customizer 实现动态参数注入
把线程池参数外置到配置文件中,再在 Customizer 中读取,便于环境差异化管理。
- 在
application.yml中定义:
server:
tomcat:
max-threads: 200
min-spare-threads: 20
max-connections: 10000
accept-count: 100
- 在 Customizer 中用
@Value或@ConfigurationProperties注入参数 - 注意:Spring Boot 内置的
server.tomcat.*配置项会自动生效,但部分参数(如accept-count)需 Customizer 才能生效 - 若同时用了 yml 配置和 Customizer,Customizer 优先级更高,会覆盖 yml 值
区分 HTTP/HTTPS Connector 并分别定制
当应用同时暴露 HTTP 和 HTTPS 端口时,需确保 Customizer 修改的是目标协议的 Connector。
- 默认只存在一个 HTTP connector;添加 HTTPS 后会有两个,需按 protocol 类型或 port 区分
- 可通过
connector.getProtocolHandler().getProtocol()判断(返回类似org.apache.coyote.http11.Http11NioProtocol) - 也可通过
connector.getPort()过滤,例如只改 443 端口的 HTTPS 连接器 - HTTPS connector 默认使用
Http11NioProtocol,但 SSL 层由SSLHostConfig管理,线程池参数仍归属 ProtocolHandler
验证是否生效的简单方法
启动后检查日志或运行时状态,确认配置已加载。
- 启动日志中搜索
Tomcat started on port(s),接着看是否有 connector 初始化信息 - 访问
http://localhost:8080/actuator/env(需启用 actuator),搜索tomcat相关属性 - 编写一个 Endpoint 或 Controller,通过 JMX 或反射读取当前 connector 的
maxThreads值(生产慎用) - 压测时观察线程数上限是否达到设定值(如用 jconsole 查看
ThreadPoolMBean)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










