可通过自定义rejectedexecutionhandler结合micrometer埋点统计拒绝次数,并用prometheus+grafana大盘监控,按pool标签下钻分析,辅以日志和排队时长诊断根因。

可以通过自定义 RejectedExecutionHandler,在拒绝任务时记录指标(如原子计数器或 Micrometer 指标),再结合定时采集与阈值判断,触发告警。
重写拒绝策略并埋点统计
Java 线程池默认的拒绝策略(如 AbortPolicy、DiscardPolicy)不提供监控入口。需实现自定义处理器,在任务被拒绝时更新监控指标:
- 使用
AtomicLong或LongAdder记录拒绝次数,线程安全且高性能 - 若已接入 Micrometer(如 Spring Boot Actuator),可注册
Counter或Gauge,例如:Metrics.counter("threadpool.rejected", "name", "myPool") - 避免在拒绝逻辑中做耗时操作(如远程日志、HTTP 调用),防止阻塞线程池调度
集成 Prometheus + Grafana 实时观测
将拒绝次数暴露为 Prometheus 可采集的指标:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Spring Boot 项目启用
spring-boot-starter-actuator和micrometer-registry-prometheus - 通过
/actuator/prometheus端点暴露指标,如threadpool_rejected_total{name="myPool"} 42 - 在 Grafana 中配置面板,绘制每分钟拒绝量趋势图,并设置告警规则(例如:5 分钟内拒绝数 > 10 次)
联动告警通道(如钉钉/企业微信/Webhook)
Prometheus Alertmanager 可对接多种通知方式:
- 配置 Alertmanager 的
receiver,指定 Webhook 地址(如钉钉机器人 token) - 告警规则示例:
expr: increase(threadpool_rejected_total{name="myPool"}[5m]) > 10 - 告警消息中建议携带上下文:线程池当前活跃线程数、队列大小、拒绝时间,便于快速定位(可通过
ThreadPoolExecutor的getActiveCount()、getQueue().size()等方法获取)
补充:运行时动态采集与诊断建议
除被动告警外,可定期主动采集关键状态辅助分析:
- 定时任务每 30 秒调用
ThreadPoolExecutor的getPoolSize()、getActiveCount()、getCompletedTaskCount()、getQueue().size() - 当拒绝次数突增时,自动 dump 当前队列中的任务类型(如打印前 3 个任务的
toString()),帮助识别是否某类慢任务堆积 - 结合 JVM 线程 dump 和 GC 日志,判断是否因 GC 停顿或 CPU 过载导致任务处理延迟、队列积压
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










