From 9397ecab8d15a4f1ca8e521e267d37e4970186a9 Mon Sep 17 00:00:00 2001 From: "chen.ma" Date: Sun, 6 Mar 2022 14:16:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=B9=E5=99=A8=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=20Jetty=E3=80=81Undertow.=20(#113=E3=80=81#1?= =?UTF-8?q?14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 26 ++++++++++++++ .../DynamicThreadPoolAutoConfiguration.java | 2 +- .../controller/WebThreadPoolController.java | 2 ++ .../web/JettyWebThreadPoolHandler.java | 12 ++++--- .../web/TomcatWebThreadPoolHandler.java | 7 ++-- .../web/WebThreadPoolRunStateHandler.java | 35 +++++++++++++++++++ 6 files changed, 75 insertions(+), 9 deletions(-) diff --git a/hippo4j-example/hippo4j-spring-boot-starter-example/pom.xml b/hippo4j-example/hippo4j-spring-boot-starter-example/pom.xml index 6ecec422..e48e8517 100644 --- a/hippo4j-example/hippo4j-spring-boot-starter-example/pom.xml +++ b/hippo4j-example/hippo4j-spring-boot-starter-example/pom.xml @@ -27,6 +27,32 @@ hippo4j-spring-boot-starter ${revision} + + + org.springframework.boot + spring-boot-starter-web + + + + + + + diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/config/DynamicThreadPoolAutoConfiguration.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/config/DynamicThreadPoolAutoConfiguration.java index 86b3feca..ca98697a 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/config/DynamicThreadPoolAutoConfiguration.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/config/DynamicThreadPoolAutoConfiguration.java @@ -47,7 +47,7 @@ import org.springframework.core.env.ConfigurableEnvironment; @ImportAutoConfiguration({HttpClientConfiguration.class, DiscoveryConfiguration.class, MessageNotifyConfiguration.class, UtilAutoConfiguration.class}) public class DynamicThreadPoolAutoConfiguration { - private static final String TOMCAT_SERVLET_WEB_SERVER_FACTORY = "tomcatWebThreadPoolHandler"; + private static final String TOMCAT_SERVLET_WEB_SERVER_FACTORY = "tomcatServletWebServerFactory"; private static final String JETTY_SERVLET_WEB_SERVER_FACTORY = "JettyServletWebServerFactory"; diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/controller/WebThreadPoolController.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/controller/WebThreadPoolController.java index abc28152..959fe58d 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/controller/WebThreadPoolController.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/controller/WebThreadPoolController.java @@ -16,6 +16,8 @@ import java.util.concurrent.Executor; /** * Web thread pool controller. * + *

At present, only Tomcat is well supported, and other web containers need to be improved. + * * @author chen.ma * @date 2022/1/19 20:54 */ diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/JettyWebThreadPoolHandler.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/JettyWebThreadPoolHandler.java index 6a5d9d9f..443e9265 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/JettyWebThreadPoolHandler.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/JettyWebThreadPoolHandler.java @@ -2,7 +2,7 @@ package cn.hippo4j.starter.handler.web; import cn.hippo4j.common.model.PoolParameterInfo; import lombok.extern.slf4j.Slf4j; -import org.eclipse.jetty.util.thread.ThreadPool; +import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.springframework.boot.web.embedded.jetty.JettyWebServer; import org.springframework.boot.web.server.WebServer; @@ -25,17 +25,21 @@ public class JettyWebThreadPoolHandler extends AbstractWebThreadPoolService { @Override public void updateWebThreadPool(PoolParameterInfo poolParameterInfo) { try { - ThreadPool.SizedThreadPool jettyExecutor = (ThreadPool.SizedThreadPool) executor; + QueuedThreadPool jettyExecutor = (QueuedThreadPool) executor; + + int minThreads = jettyExecutor.getMinThreads(); + int maxThreads = jettyExecutor.getMaxThreads(); Integer coreSize = poolParameterInfo.getCoreSize(); Integer maxSize = poolParameterInfo.getMaxSize(); + jettyExecutor.setMinThreads(coreSize); jettyExecutor.setMaxThreads(maxSize); log.info( "🔥 Changed web thread pool. coreSize :: [{}], maxSize :: [{}]", - String.format("%s => %s", jettyExecutor.getMinThreads(), coreSize), - String.format("%s => %s", jettyExecutor.getMaxThreads(), maxSize) + String.format("%s => %s", minThreads, jettyExecutor.getMinThreads()), + String.format("%s => %s", maxThreads, jettyExecutor.getMaxThreads()) ); } catch (Exception ex) { log.error("Failed to modify the jetty thread pool parameter.", ex); diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/TomcatWebThreadPoolHandler.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/TomcatWebThreadPoolHandler.java index 7aa8ba7e..b01ad194 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/TomcatWebThreadPoolHandler.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/TomcatWebThreadPoolHandler.java @@ -48,14 +48,13 @@ public class TomcatWebThreadPoolHandler extends AbstractWebThreadPoolService { public void updateWebThreadPool(PoolParameterInfo poolParameterInfo) { try { ThreadPoolExecutor tomcatExecutor = (ThreadPoolExecutor) executor; - tomcatExecutor.setCorePoolSize(poolParameterInfo.getCoreSize()); - tomcatExecutor.setMaximumPoolSize(poolParameterInfo.getMaxSize()); - tomcatExecutor.setKeepAliveTime(poolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS); - int originalCoreSize = tomcatExecutor.getCorePoolSize(); int originalMaximumPoolSize = tomcatExecutor.getMaximumPoolSize(); long originalKeepAliveTime = tomcatExecutor.getKeepAliveTime(TimeUnit.SECONDS); + tomcatExecutor.setCorePoolSize(poolParameterInfo.getCoreSize()); + tomcatExecutor.setMaximumPoolSize(poolParameterInfo.getMaxSize()); + tomcatExecutor.setKeepAliveTime(poolParameterInfo.getKeepAliveTime(), TimeUnit.SECONDS); log.info( "🔥 Changed web thread pool. coreSize :: [{}], maxSize :: [{}], keepAliveTime :: [{}]", String.format("%s => %s", originalCoreSize, poolParameterInfo.getCoreSize()), diff --git a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/WebThreadPoolRunStateHandler.java b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/WebThreadPoolRunStateHandler.java index bf7d2553..dfea233b 100644 --- a/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/WebThreadPoolRunStateHandler.java +++ b/hippo4j-spring-boot/hippo4j-spring-boot-starter/src/main/java/cn/hippo4j/starter/handler/web/WebThreadPoolRunStateHandler.java @@ -2,11 +2,17 @@ package cn.hippo4j.starter.handler.web; import cn.hippo4j.common.model.PoolBaseInfo; import cn.hippo4j.common.model.PoolRunStateInfo; +import cn.hippo4j.common.toolkit.ReflectUtil; import cn.hippo4j.starter.handler.AbstractThreadPoolRuntime; import cn.hippo4j.starter.toolkit.ByteConvertUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.system.RuntimeInfo; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.xnio.Options; +import org.xnio.XnioWorker; +import java.util.Objects; import java.util.concurrent.*; /** @@ -15,6 +21,7 @@ import java.util.concurrent.*; * @author chen.ma * @date 2022/1/19 21:05 */ +@Slf4j public class WebThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { @Override @@ -38,7 +45,35 @@ public class WebThreadPoolRunStateHandler extends AbstractThreadPoolRuntime { poolBaseInfo.setQueueType(queue.getClass().getSimpleName()); poolBaseInfo.setQueueCapacity(queueCapacity); poolBaseInfo.setRejectedName(rejectedExecutionHandler.getClass().getSimpleName()); + } else if (Objects.equals("QueuedThreadPool", executor.getClass().getSimpleName())) { + QueuedThreadPool queuedThreadPool = (QueuedThreadPool) executor; + poolBaseInfo.setCoreSize(queuedThreadPool.getMinThreads()); + poolBaseInfo.setMaximumSize(queuedThreadPool.getMaxThreads()); + + BlockingQueue jobs = (BlockingQueue) ReflectUtil.getFieldValue(queuedThreadPool, "_jobs"); + int queueCapacity = jobs.remainingCapacity() + jobs.size(); + + poolBaseInfo.setQueueCapacity(queueCapacity); + poolBaseInfo.setQueueType(jobs.getClass().getSimpleName()); + poolBaseInfo.setKeepAliveTime((long) queuedThreadPool.getIdleTimeout()); + poolBaseInfo.setRejectedName("RejectedExecutionException"); + } else if (Objects.equals("NioXnioWorker", executor.getClass().getSimpleName())) { + XnioWorker xnioWorker = (XnioWorker) executor; + try { + int coreSize = xnioWorker.getOption(Options.WORKER_TASK_CORE_THREADS); + int maximumPoolSize = xnioWorker.getOption(Options.WORKER_TASK_MAX_THREADS); + int keepAliveTime = xnioWorker.getOption(Options.WORKER_TASK_KEEPALIVE); + + poolBaseInfo.setCoreSize(coreSize); + poolBaseInfo.setMaximumSize(maximumPoolSize); + poolBaseInfo.setKeepAliveTime((long) keepAliveTime); + poolBaseInfo.setRejectedName("-"); + poolBaseInfo.setQueueType("-"); + } catch (Exception ex) { + log.error("The undertow container failed to get thread pool parameters.", ex); + } } + return poolBaseInfo; }