From f0f440999d13742f1083414cace0e7266c9aebc1 Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Tue, 7 Dec 2021 21:50:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E7=89=88=E6=96=B9=E6=B3=95=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=E8=8E=B7=E5=8F=96=E7=BA=BF=E7=A8=8B=E6=B1=A0=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E7=8A=B6=E6=80=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/inittest/RunStateHandlerTest.java | 3 +- .../handler/AbstractThreadPoolRuntime.java | 91 +++++++++++++++++++ .../handler/ThreadPoolRunStateHandler.java | 71 ++------------- 3 files changed, 100 insertions(+), 65 deletions(-) create mode 100644 hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/AbstractThreadPoolRuntime.java diff --git a/hippo4j-example/src/main/java/cn/hippo4j/example/inittest/RunStateHandlerTest.java b/hippo4j-example/src/main/java/cn/hippo4j/example/inittest/RunStateHandlerTest.java index b02a3ebd..6a5ef1ce 100644 --- a/hippo4j-example/src/main/java/cn/hippo4j/example/inittest/RunStateHandlerTest.java +++ b/hippo4j-example/src/main/java/cn/hippo4j/example/inittest/RunStateHandlerTest.java @@ -4,6 +4,7 @@ import cn.hutool.core.thread.ThreadUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.Random; import java.util.concurrent.ThreadPoolExecutor; @@ -21,7 +22,7 @@ public class RunStateHandlerTest { @Resource private ThreadPoolExecutor dynamicThreadPoolExecutor; - // @PostConstruct + @PostConstruct @SuppressWarnings("all") public void runStateHandlerTest() { log.info("Test thread pool runtime state interface, The rejection policy will be triggered after 30s..."); diff --git a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/AbstractThreadPoolRuntime.java b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/AbstractThreadPoolRuntime.java new file mode 100644 index 00000000..9607e974 --- /dev/null +++ b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/AbstractThreadPoolRuntime.java @@ -0,0 +1,91 @@ +package cn.hippo4j.starter.handler; + +import cn.hippo4j.common.model.PoolRunStateInfo; +import cn.hippo4j.starter.core.DynamicThreadPoolExecutor; +import cn.hippo4j.starter.core.GlobalThreadPoolManage; +import cn.hippo4j.starter.toolkit.CalculateUtil; +import cn.hippo4j.starter.wrapper.DynamicThreadPoolWrapper; +import cn.hutool.core.date.DateUtil; + +import java.util.Date; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * Abstract threadPool runtime info. + * + * @author chen.ma + * @date 2021/12/7 19:44 + */ +public abstract class AbstractThreadPoolRuntime { + + /** + * Supplement. + * + * @param basePoolRunStateInfo + * @return + */ + protected abstract PoolRunStateInfo supplement(PoolRunStateInfo basePoolRunStateInfo); + + /** + * Get pool run state. + * + * @param threadPoolId + * @return + */ + public PoolRunStateInfo getPoolRunState(String threadPoolId) { + DynamicThreadPoolWrapper executorService = GlobalThreadPoolManage.getExecutorService(threadPoolId); + ThreadPoolExecutor pool = executorService.getExecutor(); + + // 核心线程数 + 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 = CalculateUtil.divide(activeCount, maximumPoolSize) + "%"; + // 峰值负载 + String peakLoad = CalculateUtil.divide(largestPoolSize, maximumPoolSize) + "%"; + + BlockingQueue queue = pool.getQueue(); + // 队列元素个数 + int queueSize = queue.size(); + // 队列类型 + String queueType = queue.getClass().getSimpleName(); + // 队列剩余容量 + int remainingCapacity = queue.remainingCapacity(); + // 队列容量 + int queueCapacity = queueSize + remainingCapacity; + + PoolRunStateInfo stateInfo = new PoolRunStateInfo(); + stateInfo.setCoreSize(corePoolSize); + stateInfo.setTpId(threadPoolId); + stateInfo.setPoolSize(poolSize); + stateInfo.setMaximumSize(maximumPoolSize); + stateInfo.setActiveSize(activeCount); + stateInfo.setCurrentLoad(currentLoad); + stateInfo.setQueueType(queueType); + stateInfo.setPeakLoad(peakLoad); + stateInfo.setQueueSize(queueSize); + stateInfo.setQueueCapacity(queueCapacity); + stateInfo.setQueueRemainingCapacity(remainingCapacity); + stateInfo.setLargestPoolSize(largestPoolSize); + stateInfo.setCompletedTaskCount(completedTaskCount); + + int rejectCount = pool instanceof DynamicThreadPoolExecutor + ? ((DynamicThreadPoolExecutor) pool).getRejectCount() + : -1; + stateInfo.setRejectCount(rejectCount); + stateInfo.setClientLastRefreshTime(DateUtil.formatDateTime(new Date())); + + return supplement(stateInfo); + } + +} diff --git a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/ThreadPoolRunStateHandler.java b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/ThreadPoolRunStateHandler.java index e3447e44..38d42ded 100644 --- a/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/ThreadPoolRunStateHandler.java +++ b/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/ThreadPoolRunStateHandler.java @@ -1,21 +1,13 @@ package cn.hippo4j.starter.handler; import cn.hippo4j.common.model.PoolRunStateInfo; -import cn.hippo4j.starter.core.DynamicThreadPoolExecutor; -import cn.hippo4j.starter.core.GlobalThreadPoolManage; import cn.hippo4j.starter.toolkit.ByteConvertUtil; -import cn.hippo4j.starter.toolkit.CalculateUtil; -import cn.hippo4j.starter.wrapper.DynamicThreadPoolWrapper; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.system.RuntimeInfo; import lombok.extern.slf4j.Slf4j; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.Date; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; /** * Thread pool run state service. @@ -24,7 +16,7 @@ import java.util.concurrent.ThreadPoolExecutor; * @date 2021/7/12 21:25 */ @Slf4j -public class ThreadPoolRunStateHandler { +public class ThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { private static InetAddress INET_ADDRESS; @@ -36,37 +28,8 @@ public class ThreadPoolRunStateHandler { } } - public static PoolRunStateInfo getPoolRunState(String tpId) { - DynamicThreadPoolWrapper executorService = GlobalThreadPoolManage.getExecutorService(tpId); - ThreadPoolExecutor pool = executorService.getExecutor(); - - // 核心线程数 - 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 = CalculateUtil.divide(activeCount, maximumPoolSize) + "%"; - // 峰值负载 - String peakLoad = CalculateUtil.divide(largestPoolSize, maximumPoolSize) + "%"; - - BlockingQueue queue = pool.getQueue(); - // 队列类型 - String queueType = queue.getClass().getSimpleName(); - // 队列元素个数 - int queueSize = queue.size(); - // 队列剩余容量 - int remainingCapacity = queue.remainingCapacity(); - // 队列容量 - int queueCapacity = queueSize + remainingCapacity; - + @Override + protected PoolRunStateInfo supplement(PoolRunStateInfo poolRunStateInfo) { // 内存占比: 使用内存 / 最大内存 RuntimeInfo runtimeInfo = new RuntimeInfo(); String memoryProportion = StrUtil.builder( @@ -76,31 +39,11 @@ public class ThreadPoolRunStateHandler { ByteConvertUtil.getPrintSize(runtimeInfo.getMaxMemory()) ).toString(); - 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(INET_ADDRESS.getHostAddress()); - stateInfo.setTpId(tpId); - stateInfo.setMemoryProportion(memoryProportion); - stateInfo.setFreeMemory(ByteConvertUtil.getPrintSize(runtimeInfo.getFreeMemory())); - - int rejectCount = pool instanceof DynamicThreadPoolExecutor - ? ((DynamicThreadPoolExecutor) pool).getRejectCount() - : -1; - stateInfo.setRejectCount(rejectCount); - stateInfo.setClientLastRefreshTime(DateUtil.formatDateTime(new Date())); + poolRunStateInfo.setHost(INET_ADDRESS.getHostAddress()); + poolRunStateInfo.setMemoryProportion(memoryProportion); + poolRunStateInfo.setFreeMemory(ByteConvertUtil.getPrintSize(runtimeInfo.getFreeMemory())); - return stateInfo; + return poolRunStateInfo; } }