Added Undertow thread pool parameters (#1464)

pull/1457/head
furaul 10 months ago committed by GitHub
parent eef8d53336
commit f1957dda88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -90,7 +90,7 @@ public interface BootstrapPropertiesInterface {
/** /**
* Get apollo. * Get apollo.
*/ */
default Map<String, String> getApollo(){ default Map<String, String> getApollo() {
return null; return null;
} }

@ -105,8 +105,8 @@ public class WebThreadPoolHandlerConfiguration {
* the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time * the Web embedded server loads the {@link ServletWebServerFactory} top-level interface type at the same time
*/ */
@Bean @Bean
public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler() { public UndertowWebThreadPoolHandlerAdapt undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) {
return new DefaultUndertowWebThreadPoolHandler(); return new DefaultUndertowWebThreadPoolHandler(webThreadPoolRunStateHandler);
} }
} }
} }

@ -89,8 +89,8 @@ public class WebThreadPoolHandlerConfiguration1x {
static class EmbeddedUndertow { static class EmbeddedUndertow {
@Bean @Bean
public WebThreadPoolService undertowWebThreadPoolHandler() { public WebThreadPoolService undertowWebThreadPoolHandler(WebThreadPoolRunStateHandler webThreadPoolRunStateHandler) {
return new UndertowWebThreadPoolHandler1x(); return new UndertowWebThreadPoolHandler1x(webThreadPoolRunStateHandler);
} }
} }
} }

@ -18,6 +18,7 @@
package cn.hippo4j.config.springboot1x.starter.web.undertow; package cn.hippo4j.config.springboot1x.starter.web.undertow;
import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerSupport; import cn.hippo4j.adapter.web.undertow.UndertowWebThreadPoolHandlerSupport;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x; import cn.hippo4j.config.springboot1x.starter.web.AbstractWebThreadPoolService1x;
import io.undertow.Undertow; import io.undertow.Undertow;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -35,8 +36,8 @@ public class UndertowWebThreadPoolHandler1x extends AbstractWebThreadPoolService
private static final String UNDERTOW_NAME = "undertow"; private static final String UNDERTOW_NAME = "undertow";
public UndertowWebThreadPoolHandler1x() { public UndertowWebThreadPoolHandler1x(AbstractThreadPoolRuntime runtime) {
super(new UndertowWebThreadPoolHandlerSupport()); super(new UndertowWebThreadPoolHandlerSupport(runtime));
} }
@Override @Override

@ -22,6 +22,7 @@ import java.util.Objects;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService; import cn.hippo4j.adapter.web.DefaultAbstractWebThreadPoolService;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import io.undertow.Undertow; import io.undertow.Undertow;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -39,8 +40,8 @@ public class DefaultUndertowWebThreadPoolHandler extends DefaultAbstractWebThrea
private static final String UNDERTOW_NAME = "undertow"; private static final String UNDERTOW_NAME = "undertow";
public DefaultUndertowWebThreadPoolHandler() { public DefaultUndertowWebThreadPoolHandler(AbstractThreadPoolRuntime runtime) {
super(new UndertowWebThreadPoolHandlerSupport()); super(new UndertowWebThreadPoolHandlerSupport(runtime));
} }
/** /**

@ -24,9 +24,12 @@ import cn.hippo4j.common.model.ThreadPoolBaseInfo;
import cn.hippo4j.common.model.ThreadPoolParameter; import cn.hippo4j.common.model.ThreadPoolParameter;
import cn.hippo4j.common.model.ThreadPoolParameterInfo; import cn.hippo4j.common.model.ThreadPoolParameterInfo;
import cn.hippo4j.common.model.ThreadPoolRunStateInfo; import cn.hippo4j.common.model.ThreadPoolRunStateInfo;
import cn.hippo4j.common.support.AbstractThreadPoolRuntime;
import cn.hippo4j.common.toolkit.CalculateUtil; import cn.hippo4j.common.toolkit.CalculateUtil;
import cn.hippo4j.common.toolkit.ReflectUtil;
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor; import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jboss.threads.EnhancedQueueExecutor;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.xnio.Options; import org.xnio.Options;
import org.xnio.XnioWorker; import org.xnio.XnioWorker;
@ -44,8 +47,14 @@ import java.util.concurrent.Executor;
@Slf4j @Slf4j
public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport { public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport {
private final AbstractThreadPoolRuntime runtime;
private Executor executor; private Executor executor;
public UndertowWebThreadPoolHandlerSupport(AbstractThreadPoolRuntime runtime) {
this.runtime = runtime;
}
/** /**
* A callback will be invoked and the Executor will be set up when the web container has been started. * 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 Undertow container. * @param executor Thread-pool executor in Undertow container.
@ -56,6 +65,7 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
} }
private final long noRejectCount = -1L; private final long noRejectCount = -1L;
@Override @Override
public ThreadPoolBaseInfo simpleInfo() { public ThreadPoolBaseInfo simpleInfo() {
ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo(); ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo();
@ -67,8 +77,17 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
poolBaseInfo.setCoreSize(coreSize); poolBaseInfo.setCoreSize(coreSize);
poolBaseInfo.setMaximumSize(maximumPoolSize); poolBaseInfo.setMaximumSize(maximumPoolSize);
poolBaseInfo.setKeepAliveTime((long) keepAliveTime); poolBaseInfo.setKeepAliveTime((long) keepAliveTime);
poolBaseInfo.setRejectedName("-"); poolBaseInfo.setRejectedName("RejectedExecutionException");
poolBaseInfo.setQueueType("-"); poolBaseInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO");
EnhancedQueueExecutor enhancedQueueExecutor =
(EnhancedQueueExecutor) ReflectUtil.getFieldValue(
ReflectUtil.getFieldValue(xnioWorker, "taskPool"), "executor");
Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize");
ReflectionUtils.makeAccessible(getMaximumQueueSize);
int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor);
poolBaseInfo.setQueueCapacity(queueCapacity);
} catch (Exception ex) { } catch (Exception ex) {
log.error("The undertow container failed to get thread pool parameters.", ex); log.error("The undertow container failed to get thread pool parameters.", ex);
} }
@ -112,6 +131,33 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount"); Method getActiveCount = ReflectionUtils.findMethod(fieldObject.getClass(), "getActiveCount");
ReflectionUtils.makeAccessible(getActiveCount); ReflectionUtils.makeAccessible(getActiveCount);
int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject); int activeCount = (int) ReflectionUtils.invokeMethod(getActiveCount, fieldObject);
Field executorFiled = ReflectionUtils.findField(fieldObject.getClass(), "executor");
ReflectionUtils.makeAccessible(executorFiled);
EnhancedQueueExecutor enhancedQueueExecutor = (EnhancedQueueExecutor) ReflectionUtils.getField(executorFiled, fieldObject);
Method getLargestPoolSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getLargestPoolSize");
ReflectionUtils.makeAccessible(getLargestPoolSize);
int largestPoolSize = (int) ReflectionUtils.invokeMethod(getLargestPoolSize, enhancedQueueExecutor);
Method getQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getQueueSize");
ReflectionUtils.makeAccessible(getQueueSize);
int queueSize = (int) ReflectionUtils.invokeMethod(getQueueSize, enhancedQueueExecutor);
Method getMaximumQueueSize = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getMaximumQueueSize");
ReflectionUtils.makeAccessible(getMaximumQueueSize);
int queueCapacity = (int) ReflectionUtils.invokeMethod(getMaximumQueueSize, enhancedQueueExecutor);
int remainingCapacity = queueCapacity - queueSize;
Method getCompletedTaskCount = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getCompletedTaskCount");
ReflectionUtils.makeAccessible(getCompletedTaskCount);
long completedTaskCount = (long) ReflectionUtils.invokeMethod(getCompletedTaskCount, enhancedQueueExecutor);
Method getHandoffExecutor = ReflectionUtils.findMethod(enhancedQueueExecutor.getClass(), "getHandoffExecutor");
ReflectionUtils.makeAccessible(getHandoffExecutor);
Executor handoffExecutor = (Executor) ReflectionUtils.invokeMethod(getHandoffExecutor, enhancedQueueExecutor);
activeCount = Math.max(activeCount, 0); activeCount = Math.max(activeCount, 0);
String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + ""; String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
@ -127,7 +173,16 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
stateInfo.setRejectCount(rejectCount); stateInfo.setRejectCount(rejectCount);
stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
stateInfo.setTimestamp(System.currentTimeMillis()); stateInfo.setTimestamp(System.currentTimeMillis());
return stateInfo;
stateInfo.setQueueType("org.jboss.threads.EnhancedQueueExecutor.TaskNode:FIFO");
stateInfo.setQueueSize(queueSize);
stateInfo.setQueueCapacity(queueCapacity);
stateInfo.setQueueRemainingCapacity(remainingCapacity);
stateInfo.setLargestPoolSize(largestPoolSize);
stateInfo.setCompletedTaskCount(completedTaskCount);
stateInfo.setRejectedName(handoffExecutor.getClass().getName());
return runtime.supplement(stateInfo);
} }
@Override @Override

Loading…
Cancel
Save