You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过健康检查监控应用端口的Tomcat工作线程池可用性

解决方案:通过自定义健康指标监控Tomcat应用线程池状态

针对你遇到的Tomcat工作线程因Close_Wait耗尽、且Actuator使用独立线程池无法直接监控应用线程池的问题,在Spring Boot 2.2.7中可以通过自定义HealthIndicator实现需求,具体步骤如下:

1. 编写自定义健康指标类

创建一个实现HealthIndicator的Bean,通过Spring上下文获取应用的Tomcat WebServer实例,进而提取工作线程池的状态信息,还可扩展加入Close_Wait连接的统计:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.web.embedded.tomcat.TomcatWebServer;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.threads.ThreadPoolExecutor;

@Component
public class TomcatThreadPoolHealthIndicator implements HealthIndicator {

    private final ApplicationContext applicationContext;

    public TomcatThreadPoolHealthIndicator(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Override
    public Health health() {
        // 获取应用的Tomcat WebServer实例
        TomcatWebServer webServer = (TomcatWebServer) applicationContext.getBean("webServer");
        Connector connector = webServer.getTomcat().getConnector();
        ThreadPoolExecutor threadPool = (ThreadPoolExecutor) connector.getProtocolHandler().getExecutor();

        // 收集线程池关键指标
        int activeThreads = threadPool.getActiveCount();
        int coreThreads = threadPool.getCorePoolSize();
        int maxThreads = threadPool.getMaximumPoolSize();
        int queueSize = threadPool.getQueue().size();
        long completedTasks = threadPool.getCompletedTaskCount();

        // 初始化健康状态为UP
        Health.Builder healthBuilder = Health.up()
                .withDetail("active_threads", activeThreads)
                .withDetail("core_threads", coreThreads)
                .withDetail("max_threads", maxThreads)
                .withDetail("queue_size", queueSize)
                .withDetail("completed_tasks", completedTasks);

        // 自定义健康判定规则:活跃线程数超过最大线程数90%则标记为DOWN
        if (activeThreads >= maxThreads * 0.9) {
            healthBuilder = Health.down()
                    .withDetail("active_threads", activeThreads)
                    .withDetail("max_threads", maxThreads)
                    .withDetail("message", "线程池接近耗尽");
        }

        return healthBuilder.build();
    }
}

2. 配置Actuator暴露健康端点

在application.properties中配置Actuator的健康端点,确保能访问到自定义指标:

# 暴露健康端点
management.endpoints.web.exposure.include=health
# 显示详细健康信息(生产环境可调整为when_authorized)
management.endpoint.health.show-details=always

3. 验证效果

启动应用后,访问Actuator的健康端点(比如http://<actuator-host>:<actuator-port>/actuator/health),就能看到自定义的Tomcat线程池指标,示例响应如下:

{
  "status": "UP",
  "components": {
    "tomcatThreadPool": {
      "status": "UP",
      "details": {
        "active_threads": 15,
        "core_threads": 20,
        "max_threads": 100,
        "queue_size": 0,
        "completed_tasks": 12345
      }
    }
  }
}

额外扩展:监控Close_Wait连接

如果需要监控Close_Wait状态的连接,可以通过Tomcat的JMX MBean获取统计数据,比如Catalina:type=ThreadPool,name="http-nio-8080"下的连接状态,或java.net:type=SocketStatistics的全局连接统计,在自定义健康指标类中加入对应的JMX查询逻辑即可。

内容的提问来源于stack exchange,提问作者zhenchuan9r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 09:25:13