From 1333278a534a9de652abf89d9ed6cc36fc8dfcc2 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Mon, 22 Dec 2025 18:26:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/ThreadPoolController.java | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 jsowell-admin/src/main/java/com/jsowell/web/controller/monitor/ThreadPoolController.java diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/monitor/ThreadPoolController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/monitor/ThreadPoolController.java new file mode 100644 index 000000000..2a4155193 --- /dev/null +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/monitor/ThreadPoolController.java @@ -0,0 +1,130 @@ +package com.jsowell.web.controller.monitor; + +import com.jsowell.common.core.domain.AjaxResult; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池监控 + * + * @author jsowell + */ +@RestController +@RequestMapping("/monitor/threadpool") +public class ThreadPoolController { + + @Autowired + @Qualifier("threadPoolTaskExecutor") + private ThreadPoolTaskExecutor threadPoolTaskExecutor; + + @Autowired + @Qualifier("thirdpartyTaskExecutor") + private ThreadPoolTaskExecutor thirdpartyTaskExecutor; + + @Autowired + @Qualifier("scheduledExecutorService") + private ScheduledThreadPoolExecutor scheduledExecutorService; + + /** + * 获取所有线程池运行状态 + */ + @PreAuthorize("@ss.hasPermi('monitor:threadpool:list')") + @GetMapping("/list") + public AjaxResult list() { + List> poolInfoList = new ArrayList<>(); + + // 充电桩IO线程池 + poolInfoList.add(buildTaskExecutorInfo("threadPoolTaskExecutor", "充电桩IO线程池", threadPoolTaskExecutor)); + + // 第三方推送线程池 + poolInfoList.add(buildTaskExecutorInfo("thirdpartyTaskExecutor", "第三方推送线程池", thirdpartyTaskExecutor)); + + // 定时任务线程池 + poolInfoList.add(buildScheduledExecutorInfo("scheduledExecutorService", "定时任务线程池", scheduledExecutorService)); + + return AjaxResult.success(poolInfoList); + } + + /** + * 构建 ThreadPoolTaskExecutor 信息 + */ + private Map buildTaskExecutorInfo(String name, String description, ThreadPoolTaskExecutor executor) { + Map info = new HashMap<>(); + ThreadPoolExecutor pool = executor.getThreadPoolExecutor(); + + info.put("name", name); + info.put("description", description); + info.put("type", "ThreadPoolTaskExecutor"); + + // 配置信息 + info.put("corePoolSize", pool.getCorePoolSize()); + info.put("maxPoolSize", pool.getMaximumPoolSize()); + info.put("queueCapacity", pool.getQueue().size() + pool.getQueue().remainingCapacity()); + + // 运行状态 + info.put("activeCount", pool.getActiveCount()); + info.put("poolSize", pool.getPoolSize()); + info.put("largestPoolSize", pool.getLargestPoolSize()); + info.put("taskCount", pool.getTaskCount()); + info.put("completedTaskCount", pool.getCompletedTaskCount()); + info.put("queueSize", pool.getQueue().size()); + info.put("queueRemainingCapacity", pool.getQueue().remainingCapacity()); + + // 计算指标 + int queueCapacity = pool.getQueue().size() + pool.getQueue().remainingCapacity(); + double queueUsageRate = queueCapacity > 0 ? (double) pool.getQueue().size() / queueCapacity * 100 : 0; + double threadUsageRate = pool.getMaximumPoolSize() > 0 ? (double) pool.getActiveCount() / pool.getMaximumPoolSize() * 100 : 0; + + info.put("queueUsageRate", String.format("%.2f%%", queueUsageRate)); + info.put("threadUsageRate", String.format("%.2f%%", threadUsageRate)); + + // 拒绝策略 + info.put("rejectedExecutionHandler", pool.getRejectedExecutionHandler().getClass().getSimpleName()); + + return info; + } + + /** + * 构建 ScheduledThreadPoolExecutor 信息 + */ + private Map buildScheduledExecutorInfo(String name, String description, ScheduledThreadPoolExecutor executor) { + Map info = new HashMap<>(); + + info.put("name", name); + info.put("description", description); + info.put("type", "ScheduledThreadPoolExecutor"); + + // 配置信息 + info.put("corePoolSize", executor.getCorePoolSize()); + info.put("maxPoolSize", executor.getMaximumPoolSize()); + + // 运行状态 + info.put("activeCount", executor.getActiveCount()); + info.put("poolSize", executor.getPoolSize()); + info.put("largestPoolSize", executor.getLargestPoolSize()); + info.put("taskCount", executor.getTaskCount()); + info.put("completedTaskCount", executor.getCompletedTaskCount()); + info.put("queueSize", executor.getQueue().size()); + + // 计算线程使用率 + double threadUsageRate = executor.getMaximumPoolSize() > 0 ? (double) executor.getActiveCount() / executor.getMaximumPoolSize() * 100 : 0; + info.put("threadUsageRate", String.format("%.2f%%", threadUsageRate)); + + // 拒绝策略 + info.put("rejectedExecutionHandler", executor.getRejectedExecutionHandler().getClass().getSimpleName()); + + return info; + } +}