diff --git a/common/src/main/java/io/dynamic/threadpool/common/model/PoolRunStateInfo.java b/common/src/main/java/io/dynamic/threadpool/common/model/PoolRunStateInfo.java new file mode 100644 index 00000000..16218be2 --- /dev/null +++ b/common/src/main/java/io/dynamic/threadpool/common/model/PoolRunStateInfo.java @@ -0,0 +1,92 @@ +package io.dynamic.threadpool.common.model; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * Pool Run State Info. + * + * @author chen.ma + * @date 2021/7/7 18:57 + */ +@Getter +@Setter +public class PoolRunStateInfo implements Serializable { + + /** + * 当前负载 + */ + private String currentLoad; + + /** + * 峰值负载 + */ + private String peakLoad; + + /** + * 线程池 ID + */ + private String tpId; + + /** + * 核心线程数 + */ + private Integer coreSize; + + /** + * 最大线程数 + */ + private Integer maximumSize; + + /** + * 线程池当前线程数 + */ + private Integer poolSize; + + /** + * 活跃线程数 + */ + private Integer activeSize; + + /** + * 线程池中同时进入的最大线程数 + */ + private Integer largestPoolSize; + + /** + * 队列类型 + */ + private String queueType; + + /** + * 队列容量 + */ + private Integer queueCapacity; + + /** + * 队列元素个数 + */ + private Integer queueSize; + + /** + * 队列剩余容量 + */ + private Integer queueRemainingCapacity; + + /** + * 线程池中执行任务总数量 + */ + private Long completedTaskCount; + + /** + * 拒绝策略发生次数 + */ + private Integer regectCount; + + /** + * Host + */ + private String host; +} diff --git a/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/controller/PoolRunStateController.java b/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/controller/PoolRunStateController.java new file mode 100644 index 00000000..60ccfa68 --- /dev/null +++ b/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/controller/PoolRunStateController.java @@ -0,0 +1,29 @@ +package io.dynamic.threadpool.starter.controller; + +import io.dynamic.threadpool.common.model.PoolRunStateInfo; +import io.dynamic.threadpool.common.web.base.Result; +import io.dynamic.threadpool.common.web.base.Results; +import io.dynamic.threadpool.starter.handler.ThreadPoolRunStateHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * Pool Run State Controller. + * + * @author chen.ma + * @date 2021/7/7 21:34 + */ +@RestController +public class PoolRunStateController { + + @Autowired + private ThreadPoolRunStateHandler threadPoolRunStateHandler; + + @GetMapping("/run/state/{tpId}") + public Result getPoolRunState(@PathVariable("tpId") String tpId) { + PoolRunStateInfo poolRunState = threadPoolRunStateHandler.getPoolRunState(tpId); + return Results.success(poolRunState); + } +} diff --git a/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/handler/ThreadPoolRunStateHandler.java b/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/handler/ThreadPoolRunStateHandler.java new file mode 100644 index 00000000..6148ae16 --- /dev/null +++ b/dynamic-threadpool-spring-boot-starter/src/main/java/io/dynamic/threadpool/starter/handler/ThreadPoolRunStateHandler.java @@ -0,0 +1,93 @@ +package io.dynamic.threadpool.starter.handler; + +import io.dynamic.threadpool.common.model.PoolRunStateInfo; +import io.dynamic.threadpool.starter.core.GlobalThreadPoolManage; +import io.dynamic.threadpool.starter.wrap.CustomThreadPoolExecutor; +import io.dynamic.threadpool.starter.wrap.DynamicThreadPoolWrap; +import org.springframework.stereotype.Component; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池运行状态组件. + * + * @author chen.ma + * @date 2021/7/7 19:37 + */ +@Component +public class ThreadPoolRunStateHandler { + + private static InetAddress addr; + + static { + try { + addr = InetAddress.getLocalHost(); + + } catch (UnknownHostException e) { + e.printStackTrace(); + } + } + + public PoolRunStateInfo getPoolRunState(String tpId) { + DynamicThreadPoolWrap executorService = GlobalThreadPoolManage.getExecutorService(tpId); + ThreadPoolExecutor pool = executorService.getPool(); + + // 核心线程数 + int corePoolSize = pool.getCorePoolSize(); + // 最大线程数 + int maximumPoolSize = pool.getMaximumPoolSize(); + // 线程池当前线程数 + int poolSize = pool.getPoolSize(); + // 活跃线程数 + int activeCount = pool.getActiveCount(); + // 同时进入池中的最大线程数 + int largestPoolSize = pool.getLargestPoolSize(); + // 线程池中执行任务总数量 + long completedTaskCount = pool.getCompletedTaskCount(); + // 当前负载 + String currentLoad = divide(activeCount, maximumPoolSize); + // 峰值负载 + String peakLoad = divide(largestPoolSize, maximumPoolSize); + + BlockingQueue queue = pool.getQueue(); + // 队列类型 + String queueType = queue.getClass().getSimpleName(); + // 队列元素个数 + int queueSize = queue.size(); + // 队列剩余容量 + int remainingCapacity = queue.remainingCapacity(); + // 队列容量 + int queueCapacity = queueSize + remainingCapacity; + + PoolRunStateInfo stateInfo = new PoolRunStateInfo(); + stateInfo.setCoreSize(corePoolSize); + stateInfo.setMaximumSize(maximumPoolSize); + stateInfo.setPoolSize(poolSize); + stateInfo.setActiveSize(activeCount); + stateInfo.setCurrentLoad(currentLoad); + stateInfo.setPeakLoad(peakLoad); + stateInfo.setQueueType(queueType); + stateInfo.setQueueSize(queueSize); + stateInfo.setQueueRemainingCapacity(remainingCapacity); + stateInfo.setQueueCapacity(queueCapacity); + stateInfo.setLargestPoolSize(largestPoolSize); + stateInfo.setCompletedTaskCount(completedTaskCount); + stateInfo.setHost(addr.getHostAddress()); + stateInfo.setTpId(tpId); + + int regectCount = pool instanceof CustomThreadPoolExecutor + ? ((CustomThreadPoolExecutor) pool).getRegectCount() + : -1; + stateInfo.setRegectCount(regectCount); + + return stateInfo; + } + + private static String divide(int num1, int num2) { + return ((int) (Double.parseDouble(num1 + "") / Double.parseDouble(num2 + "") * 100)) + "%"; + } + +}