通过代码获取Tomcat的其他参数

通过代码获取 Tomcat 除 maxThreads 外的其他核心参数(如 acceptCountmaxConnectionskeepAliveTimeout 等),核心逻辑和获取 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()

四、关键注意事项

  1. API 兼容性
    • Tomcat 8/9 的 API 完全兼容,Tomcat 10 因基于 Jakarta EE,包名从 javax.servlet 改为 jakarta.servlet,需调整导入包;
    • Http11NioProtocol 是 NIO 模型的实现类,若使用 APR 模型需改为 Http11AprProtocol
  2. 多 Connector 场景
    • 若 Tomcat 配置了多个 Connector(如 8080/8443),需通过 connector.getPort()connector.getProtocol() 筛选目标 Connector;
  3. 参数默认值
    • 若配置文件中未显式配置某个参数,getter 方法会返回 Tomcat 内置默认值(如 maxThreads 默认 200);
  4. 动态修改参数
    • 除了获取,也可通过 setter 方法动态修改参数(如 protocol.setMaxThreads(1000)),无需重启 Tomcat,但需注意线程安全。

总结

通过代码获取 Tomcat 所有参数的核心步骤:
  1. 获取 Connector:Spring Boot 从 ServletWebServerApplicationContext 获取,外置 Tomcat 从 StandardServer 获取;
  2. 强转协议处理器:将 Connector 的 ProtocolHandler 强转为 Http11NioProtocol(NIO 模式);
  3. 调用 getter 方法:通过协议处理器 / Connector 的 getter 方法,按需获取线程池、连接、超时等参数;
  4. 封装结果返回:将参数封装为 JSON 或其他格式,便于前端 / 监控系统使用。
以上代码可直接复用,只需根据 Tomcat 版本和部署方式微调,适合动态监控、配置审计、运维平台等场景。
阅读剩余
THE END
阿里云ECS特惠活动
阿里云ECS服务器 - 限时特惠活动

云服务器爆款直降90%

新客首单¥68起 | 人人可享99元套餐,续费同价 | u2a指定配置低至2.5折1年,立即选购享更多福利!

新客首单¥68起
人人可享99元套餐
弹性计费
7x24小时售后
立即查看活动详情
阿里云ECS服务器特惠活动