通过代码获取Tomcat的其他参数
通过代码获取 Tomcat 除
maxThreads 外的其他核心参数(如 acceptCount、maxConnections、keepAliveTimeout 等),核心逻辑和获取 maxThreads 一致 —— 先获取 Tomcat 底层的 ProtocolHandler 实例,再通过其提供的 getter 方法读取参数。以下是覆盖Spring Boot 内嵌 Tomcat 和 外置 Tomcat 的完整实现,包含常用参数的获取示例和说明。核心前提
Tomcat 的 Connector 核心参数(线程池、连接管理、超时等)都封装在
ProtocolHandler 实现类中(如 NIO 模型的 Http11NioProtocol),只需通过该类的 getter 方法即可获取所有公开参数。一、Spring Boot 内嵌 Tomcat 场景(常用)
以下示例会一次性获取 Tomcat 最常用的 10+ 核心参数,可直接集成到项目中:
java
运行
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* Spring Boot 内嵌 Tomcat 获取所有核心参数
*/
@RestController
public class TomcatAllParamsController {
@Autowired
private ServletWebServerApplicationContext applicationContext;
@GetMapping("/tomcat/allParams")
public Map<String, Object> getTomcatAllParams() {
Map<String, Object> params = new HashMap<>();
try {
// 1. 获取 Tomcat WebServer 实例
TomcatWebServer tomcatWebServer = (TomcatWebServer) applicationContext.getWebServer();
// 2. 获取默认 Service(Spring Boot 内嵌 Tomcat 默认为 "Tomcat")
org.apache.catalina.Service service = tomcatWebServer.getTomcat().getService();
// 3. 获取第一个 HTTP Connector(默认 8080 端口)
Connector connector = service.getConnectors()[0];
// 4. 强转为 NIO 协议处理器(核心:所有参数都从这里获取)
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// ========== 1. 线程池参数 ==========
params.put("maxThreads", protocol.getMaxThreads()); // 最大工作线程数
params.put("minSpareThreads", protocol.getMinSpareThreads()); // 核心常驻线程数
params.put("threadPriority", protocol.getThreadPriority()); // 线程优先级
params.put("maxIdleTime", protocol.getMaxIdleTime()); // 空闲线程超时销毁时间(ms)
params.put("acceptCount", protocol.getAcceptCount()); // 请求等待队列长度
// ========== 2. 连接管理参数 ==========
params.put("maxConnections", protocol.getMaxConnections()); // 最大并发连接数
params.put("maxKeepAliveRequests", protocol.getMaxKeepAliveRequests()); // 单个长连接最大请求数
params.put("keepAliveTimeout", protocol.getKeepAliveTimeout()); // 长连接空闲超时(ms)
params.put("connectionTimeout", protocol.getConnectionTimeout()); // 连接超时(ms)
// ========== 3. 协议/编码参数 ==========
params.put("port", connector.getPort()); // 监听端口
params.put("protocol", connector.getProtocol()); // 协议类型(如 org.apache.coyote.http11.Http11NioProtocol)
params.put("URIEncoding", connector.getURIEncoding()); // URI 编码
params.put("enableLookups", connector.getEnableLookups()); // 是否反向解析 IP 为主机名
// ========== 4. 性能优化参数 ==========
params.put("compression", connector.getCompression()); // 压缩模式(on/off/force)
params.put("compressionMinSize", connector.getCompressionMinSize()); // 触发压缩的最小响应大小(字节)
params.put("tcpNoDelay", protocol.isTcpNoDelay()); // 是否禁用 Nagle 算法
params.put("soKeepAlive", protocol.isSoKeepAlive()); // 是否开启 TCP 保活
// ========== 5. 限流参数 ==========
params.put("limitRequestLine", protocol.getLimitRequestLine()); // 请求行最大长度
params.put("limitRequestParams", protocol.getLimitRequestParams()); // 请求参数最大个数
} catch (Exception e) {
params.put("error", "获取参数失败:" + e.getMessage());
e.printStackTrace();
}
return params;
}
}
测试访问
启动 Spring Boot 应用后,访问
http://localhost:8080/tomcat/allParams,返回示例(JSON 格式):json
{
"maxThreads": 800,
"minSpareThreads": 50,
"threadPriority": 5,
"maxIdleTime": 60000,
"acceptCount": 500,
"maxConnections": 20000,
"maxKeepAliveRequests": 500,
"keepAliveTimeout": 30000,
"connectionTimeout": 30000,
"port": 8080,
"protocol": "org.apache.coyote.http11.Http11NioProtocol",
"URIEncoding": "UTF-8",
"enableLookups": false,
"compression": "on",
"compressionMinSize": 2048,
"tcpNoDelay": true,
"soKeepAlive": true,
"limitRequestLine": 8192,
"limitRequestParams": 2000
}
二、外置 Tomcat 场景(WAR 包部署)
以下示例适配外置 Tomcat,可获取所有核心参数,需注意依赖和包名适配:
步骤 1:添加 Tomcat 依赖(仅编译时)
xml
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-catalina</artifactId>
<version>9.0.80</version> <!-- 与你的 Tomcat 版本一致 -->
<scope>provided</scope> <!-- 外置 Tomcat 已提供,无需打包 -->
</dependency>
步骤 2:编写 Servlet 获取所有参数
java
运行
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardServer;
import org.apache.coyote.http11.Http11NioProtocol;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
/**
* 外置 Tomcat 获取所有核心参数
*/
@WebServlet("/tomcat/allParams")
public class TomcatAllParamsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/json;charset=UTF-8");
PrintWriter out = response.getWriter();
Map<String, Object> params = new HashMap<>();
try {
// 1. 获取 Tomcat StandardServer 实例
StandardServer server = (StandardServer) getServletContext()
.getAttribute("org.apache.catalina.core.StandardServer.INSTANCE");
// 2. 获取默认 Service(外置 Tomcat 默认为 "Catalina")
org.apache.catalina.Service service = server.findService("Catalina");
// 3. 筛选 8080 端口的 HTTP Connector(排除 AJP 连接器)
Connector connector = null;
for (Connector c : service.getConnectors()) {
if (c.getPort() == 8080 && c.getProtocolHandler() instanceof Http11NioProtocol) {
connector = c;
break;
}
}
if (connector == null) {
params.put("error", "未找到 8080 端口的 HTTP Connector");
out.write(new com.alibaba.fastjson.JSONObject(params).toJSONString());
return;
}
// 4. 获取协议处理器并读取所有参数
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
// 线程池参数
params.put("maxThreads", protocol.getMaxThreads());
params.put("minSpareThreads", protocol.getMinSpareThreads());
params.put("acceptCount", protocol.getAcceptCount());
// 连接参数
params.put("maxConnections", protocol.getMaxConnections());
params.put("keepAliveTimeout", protocol.getKeepAliveTimeout());
params.put("connectionTimeout", protocol.getConnectionTimeout());
// 其他参数
params.put("port", connector.getPort());
params.put("URIEncoding", connector.getURIEncoding());
params.put("compression", connector.getCompression());
} catch (Exception e) {
params.put("error", "获取参数失败:" + e.getMessage());
e.printStackTrace(out);
}
// 输出 JSON 格式结果(需引入 fastjson 或使用原生 JSON)
out.write(new com.alibaba.fastjson.JSONObject(params).toJSONString());
out.close();
}
}
测试访问
将 WAR 包部署到外置 Tomcat 后,访问
http://localhost:8080/[你的应用名]/tomcat/allParams,即可获取所有参数的 JSON 结果。三、Tomcat 常用参数及对应 Getter 方法
以下是开发中最常关注的 Tomcat 参数,以及
Http11NioProtocol/Connector 对应的 getter 方法,可按需获取:| 参数名称 | 作用说明 | 获取方法(protocol/connector 为实例) |
|---|---|---|
| 最大工作线程数 | Tomcat 能同时处理的请求数上限 | protocol.getMaxThreads() |
| 核心常驻线程数 | 始终保持的空闲线程数,避免频繁创建销毁 | protocol.getMinSpareThreads() |
| 请求等待队列长度 | 线程池满后,请求排队的最大长度 | protocol.getAcceptCount() |
| 最大并发连接数 | NIO 模式下能同时接收的总连接数 | protocol.getMaxConnections() |
| 长连接空闲超时 | 单个长连接空闲多久后关闭(ms) | protocol.getKeepAliveTimeout() |
| 连接超时 | 客户端建立连接后未发请求的超时时间(ms) | protocol.getConnectionTimeout() |
| 单个长连接最大请求数 | 一个长连接能处理的最大请求数 | protocol.getMaxKeepAliveRequests() |
| 监听端口 | Connector 监听的端口号 | connector.getPort() |
| URI 编码 | 解析请求 URI 的编码格式 | connector.getURIEncoding() |
| 压缩模式 | HTTP 压缩开关(on/off/force) | connector.getCompression() |
| 触发压缩的最小响应大小 | 响应体多大时触发压缩(字节) | connector.getCompressionMinSize() |
| 请求行最大长度 | 限制 URL 最大长度,防止攻击 | protocol.getLimitRequestLine() |
| 请求参数最大个数 | 限制请求参数数量,防止内存溢出 | protocol.getLimitRequestParams() |
| 是否禁用 Nagle 算法 | 减少 TCP 延迟,提升实时性 | protocol.isTcpNoDelay() |
| 是否开启 TCP 保活 | 检测无效连接并关闭 | protocol.isSoKeepAlive() |
| 是否反向解析 IP 主机名 | 关闭可提升性能(避免 DNS 解析) | connector.getEnableLookups() |
四、关键注意事项
- API 兼容性:
- Tomcat 8/9 的 API 完全兼容,Tomcat 10 因基于 Jakarta EE,包名从
javax.servlet改为jakarta.servlet,需调整导入包; Http11NioProtocol是 NIO 模型的实现类,若使用 APR 模型需改为Http11AprProtocol。
- Tomcat 8/9 的 API 完全兼容,Tomcat 10 因基于 Jakarta EE,包名从
- 多 Connector 场景:
- 若 Tomcat 配置了多个 Connector(如 8080/8443),需通过
connector.getPort()或connector.getProtocol()筛选目标 Connector;
- 若 Tomcat 配置了多个 Connector(如 8080/8443),需通过
- 参数默认值:
- 若配置文件中未显式配置某个参数,getter 方法会返回 Tomcat 内置默认值(如
maxThreads默认 200);
- 若配置文件中未显式配置某个参数,getter 方法会返回 Tomcat 内置默认值(如
- 动态修改参数:
- 除了获取,也可通过 setter 方法动态修改参数(如
protocol.setMaxThreads(1000)),无需重启 Tomcat,但需注意线程安全。
- 除了获取,也可通过 setter 方法动态修改参数(如
总结
通过代码获取 Tomcat 所有参数的核心步骤:
- 获取 Connector:Spring Boot 从
ServletWebServerApplicationContext获取,外置 Tomcat 从StandardServer获取; - 强转协议处理器:将 Connector 的
ProtocolHandler强转为Http11NioProtocol(NIO 模式); - 调用 getter 方法:通过协议处理器 / Connector 的 getter 方法,按需获取线程池、连接、超时等参数;
- 封装结果返回:将参数封装为 JSON 或其他格式,便于前端 / 监控系统使用。
以上代码可直接复用,只需根据 Tomcat 版本和部署方式微调,适合动态监控、配置审计、运维平台等场景。
阅读剩余
版权声明:
作者:SE_Yang
链接:https://www.cnesa.cn/10466.html
文章版权归作者所有,未经允许请勿转载。
THE END
阿里云ECS服务器 - 限时特惠活动
云服务器爆款直降90%
新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!
新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后