diff --git a/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java b/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java index 1bae64f4..f82b3408 100644 --- a/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java +++ b/hippo4j-adapter/hippo4j-adapter-web/src/main/java/cn/hippo4j/adapter/web/jetty/JettyWebThreadPoolHandlerSupport.java @@ -24,10 +24,13 @@ import cn.hippo4j.common.model.ThreadPoolBaseInfo; import cn.hippo4j.common.model.ThreadPoolParameter; import cn.hippo4j.common.model.ThreadPoolParameterInfo; import cn.hippo4j.common.model.ThreadPoolRunStateInfo; +import cn.hippo4j.common.toolkit.CalculateUtil; import cn.hippo4j.common.toolkit.ReflectUtil; import lombok.extern.slf4j.Slf4j; import org.eclipse.jetty.util.thread.QueuedThreadPool; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; @@ -42,6 +45,7 @@ public class JettyWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSu /** * A callback will be invoked and the Executor will be set up when the web container has been started. + * * @param executor Thread-pool executor in Jetty container. */ @Override @@ -82,7 +86,30 @@ public class JettyWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSu @Override public ThreadPoolRunStateInfo getWebRunStateInfo() { - return null; + ThreadPoolRunStateInfo runStateInfo = new ThreadPoolRunStateInfo(); + QueuedThreadPool queuedThreadPool = (QueuedThreadPool) executor; + int corePoolSize = queuedThreadPool.getMinThreads(); + int maximumPoolSize = queuedThreadPool.getMaxThreads(); + int poolSize = queuedThreadPool.getThreads(); + int busyCount = queuedThreadPool.getBusyThreads(); + String currentLoad = CalculateUtil.divide(busyCount, maximumPoolSize) + ""; + BlockingQueue queue = ReflectUtil.invoke(queuedThreadPool, "getQueue"); + String queueType = queue.getClass().getSimpleName(); + int remainingCapacity = queue.remainingCapacity(); + int queueSize = queue.size(); + int queueCapacity = queueSize + remainingCapacity; + runStateInfo.setQueueType(queueType); + runStateInfo.setQueueSize(queueSize); + runStateInfo.setQueueCapacity(queueCapacity); + runStateInfo.setQueueRemainingCapacity(remainingCapacity); + runStateInfo.setCoreSize(corePoolSize); + runStateInfo.setPoolSize(poolSize); + runStateInfo.setMaximumSize(maximumPoolSize); + runStateInfo.setActiveSize(busyCount); + runStateInfo.setCurrentLoad(currentLoad); + runStateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + runStateInfo.setTimestamp(System.currentTimeMillis()); + return runStateInfo; } @Override diff --git a/hippo4j-common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java b/hippo4j-common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java index 77535aca..34d20fcc 100644 --- a/hippo4j-common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java +++ b/hippo4j-common/src/main/java/cn/hippo4j/common/model/ThreadPoolRunStateInfo.java @@ -24,6 +24,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import java.io.Serializable; +import java.util.Objects; /** * Pool run state info. @@ -116,10 +117,16 @@ public class ThreadPoolRunStateInfo extends ThreadPoolBaseInfo implements Serial private Long timestamp; public Integer getSimpleCurrentLoad() { - return Integer.parseInt(getCurrentLoad().replace("%", "")); + if (Objects.nonNull(getCurrentLoad())){ + return Integer.parseInt(getCurrentLoad().replace("%", "")); + } + return null; } public Integer getSimplePeakLoad() { - return Integer.parseInt(getPeakLoad().replace("%", "")); + if (Objects.nonNull(getPeakLoad())){ + return Integer.parseInt(getPeakLoad().replace("%", "")); + } + return null; } }