|
|
|
@ -24,9 +24,12 @@ 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.support.AbstractThreadPoolRuntime;
|
|
|
|
|
import cn.hippo4j.common.toolkit.CalculateUtil;
|
|
|
|
|
import cn.hippo4j.common.toolkit.ReflectUtil;
|
|
|
|
|
import cn.hippo4j.core.executor.DynamicThreadPoolExecutor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.jboss.threads.EnhancedQueueExecutor;
|
|
|
|
|
import org.springframework.util.ReflectionUtils;
|
|
|
|
|
import org.xnio.Options;
|
|
|
|
|
import org.xnio.XnioWorker;
|
|
|
|
@ -44,8 +47,14 @@ import java.util.concurrent.Executor;
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandlerSupport {
|
|
|
|
|
|
|
|
|
|
private final AbstractThreadPoolRuntime runtime;
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
* @param executor Thread-pool executor in Undertow container.
|
|
|
|
@ -56,6 +65,7 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private final long noRejectCount = -1L;
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public ThreadPoolBaseInfo simpleInfo() {
|
|
|
|
|
ThreadPoolBaseInfo poolBaseInfo = new ThreadPoolBaseInfo();
|
|
|
|
@ -67,8 +77,17 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
|
|
|
|
|
poolBaseInfo.setCoreSize(coreSize);
|
|
|
|
|
poolBaseInfo.setMaximumSize(maximumPoolSize);
|
|
|
|
|
poolBaseInfo.setKeepAliveTime((long) keepAliveTime);
|
|
|
|
|
poolBaseInfo.setRejectedName("-");
|
|
|
|
|
poolBaseInfo.setQueueType("-");
|
|
|
|
|
poolBaseInfo.setRejectedName("RejectedExecutionException");
|
|
|
|
|
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) {
|
|
|
|
|
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");
|
|
|
|
|
ReflectionUtils.makeAccessible(getActiveCount);
|
|
|
|
|
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);
|
|
|
|
|
String currentLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
|
|
|
|
|
String peakLoad = CalculateUtil.divide(activeCount, maximumPoolSize) + "";
|
|
|
|
@ -127,7 +173,16 @@ public class UndertowWebThreadPoolHandlerSupport implements IWebThreadPoolHandle
|
|
|
|
|
stateInfo.setRejectCount(rejectCount);
|
|
|
|
|
stateInfo.setClientLastRefreshTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
|
|
|
|
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
|
|
|
|
|