Skip to content

Commit 31643cb

Browse files
authored
Merge pull request #512 from TheFatRatre/virtual-thread
[ISSUE #483] Virtual thread compatible
2 parents c228531 + 64afeae commit 31643cb

File tree

42 files changed

+692
-223
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+692
-223
lines changed

adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/AbstractDtpAdapter.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.apache.commons.collections4.MapUtils;
3030
import org.apache.commons.lang3.StringUtils;
3131
import org.dromara.dynamictp.common.entity.NotifyPlatform;
32-
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
32+
import org.dromara.dynamictp.common.entity.ExecutorStats;
3333
import org.dromara.dynamictp.common.entity.TpExecutorProps;
3434
import org.dromara.dynamictp.common.entity.TpMainFields;
3535
import org.dromara.dynamictp.common.event.CustomContextRefreshedEvent;
@@ -104,20 +104,20 @@ public Map<String, ExecutorWrapper> getExecutorWrappers() {
104104
}
105105

106106
/**
107-
* Get multi thread pool stats.
107+
* Get multi executor stats.
108108
*
109-
* @return thead pools stats
109+
* @return Executors stats
110110
*/
111111
@Override
112-
public List<ThreadPoolStats> getMultiPoolStats() {
112+
public List<ExecutorStats> getMultiExecutorStats() {
113113
val executorWrappers = getExecutorWrappers();
114114
if (MapUtils.isEmpty(executorWrappers)) {
115115
return Collections.emptyList();
116116
}
117117

118-
List<ThreadPoolStats> threadPoolStats = Lists.newArrayList();
119-
executorWrappers.forEach((k, v) -> threadPoolStats.add(ExecutorConverter.toMetrics(v)));
120-
return threadPoolStats;
118+
List<ExecutorStats> executorStats = Lists.newArrayList();
119+
executorWrappers.forEach((k, v) -> executorStats.add(ExecutorConverter.toMetrics(v)));
120+
return executorStats;
121121
}
122122

123123
public void refresh(List<TpExecutorProps> propsList, List<NotifyPlatform> platforms) {

adapter/adapter-common/src/main/java/org/dromara/dynamictp/adapter/common/DtpAdapterListener.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ protected void doCollect(DtpProperties dtpProperties) {
7373
if (MapUtils.isEmpty(handlerMap)) {
7474
return;
7575
}
76-
handlerMap.forEach((k, v) -> v.getMultiPoolStats().forEach(ps ->
76+
handlerMap.forEach((k, v) -> v.getMultiExecutorStats().forEach(ps ->
7777
CollectorHandler.getInstance().collect(ps, dtpProperties.getCollectorTypes())));
7878
}
7979

common/src/main/java/org/dromara/dynamictp/common/constant/DynamicTpConst.java

+5
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,9 @@ private DynamicTpConst() { }
127127
public static final String TRUE_STR = "true";
128128

129129
public static final String FALSE_STR = "false";
130+
131+
/**
132+
* jre
133+
*/
134+
public static final String THREAD_PER_TASK_EXECUTOR = "java.util.concurrent.ThreadPerTaskExecutor";
130135
}

common/src/main/java/org/dromara/dynamictp/common/em/JreEnum.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,18 @@ public enum JreEnum {
5454

5555
JAVA_18,
5656

57-
JAVA_19;
57+
JAVA_19,
58+
59+
JAVA_20,
60+
61+
JAVA_21;
5862

5963
private static final JreEnum VERSION = getJre();
6064

6165
public static final String DEFAULT_JAVA_VERSION = "1.8";
6266

67+
private static final int JRE_VERSION_OFFSET = 8;
68+
6369
/**
6470
* get current JRE version
6571
*
@@ -69,6 +75,14 @@ public static JreEnum currentVersion() {
6975
return VERSION;
7076
}
7177

78+
/**
79+
* get current JRE integer version
80+
* @return JRE integer version
81+
*/
82+
public static int currentIntVersion() {
83+
return JreEnum.currentVersion().ordinal() + JRE_VERSION_OFFSET;
84+
}
85+
7286
/**
7387
* is current version
7488
*

common/src/main/java/org/dromara/dynamictp/common/entity/ThreadPoolStats.java renamed to common/src/main/java/org/dromara/dynamictp/common/entity/ExecutorStats.java

+32-26
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,24 @@
2222

2323

2424
/**
25-
* ThreadPoolStats related
25+
* ExecutorStats related
2626
*
2727
* @author yanhom
2828
* @since 1.0.0
2929
**/
3030
@Data
3131
@EqualsAndHashCode(callSuper = true)
32-
public class ThreadPoolStats extends Metrics {
32+
public class ExecutorStats extends Metrics {
3333

3434
/**
35-
* 线程池名字
35+
* 执行器名字
3636
*/
37-
private String poolName;
37+
private String executorName;
3838

3939
/**
40-
* 线程池别名
40+
* 执行器别名
4141
*/
42-
private String poolAliasName;
42+
private String executorAliasName;
4343

4444
/**
4545
* 核心线程数
@@ -51,6 +51,31 @@ public class ThreadPoolStats extends Metrics {
5151
*/
5252
private int maximumPoolSize;
5353

54+
/**
55+
* 正在执行任务的活跃线程大致总数
56+
*/
57+
private int activeCount;
58+
59+
/**
60+
* 大致任务总数
61+
*/
62+
private long taskCount;
63+
64+
/**
65+
* 执行超时任务数量
66+
*/
67+
private long runTimeoutCount;
68+
69+
/**
70+
* 是否为DtpExecutor
71+
*/
72+
private boolean dynamic;
73+
74+
/**
75+
* 是否为虚拟线程执行器
76+
*/
77+
private boolean isVirtualExecutor;
78+
5479
/**
5580
* 空闲时间 (ms)
5681
*/
@@ -81,16 +106,6 @@ public class ThreadPoolStats extends Metrics {
81106
*/
82107
private int queueRemainingCapacity;
83108

84-
/**
85-
* 正在执行任务的活跃线程大致总数
86-
*/
87-
private int activeCount;
88-
89-
/**
90-
* 大致任务总数
91-
*/
92-
private long taskCount;
93-
94109
/**
95110
* 已执行完成的大致任务总数
96111
*/
@@ -121,16 +136,6 @@ public class ThreadPoolStats extends Metrics {
121136
*/
122137
private String rejectHandlerName;
123138

124-
/**
125-
* 是否DtpExecutor线程池
126-
*/
127-
private boolean dynamic;
128-
129-
/**
130-
* 执行超时任务数量
131-
*/
132-
private long runTimeoutCount;
133-
134139
/**
135140
* 在队列等待超时任务数量
136141
*/
@@ -185,4 +190,5 @@ public class ThreadPoolStats extends Metrics {
185190
* 满足99.9%的任务执行所需的最低耗时
186191
*/
187192
private double tp999;
193+
188194
}

common/src/main/java/org/dromara/dynamictp/common/entity/Metrics.java

+1
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@
2727
**/
2828
@Data
2929
public class Metrics {
30+
3031
}

core/src/main/java/org/dromara/dynamictp/core/DtpRegistry.java

-1
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,6 @@ private static void doRefreshCommon(ExecutorWrapper executorWrapper, DtpExecutor
242242
if (StringUtils.isNotBlank(props.getThreadPoolAliasName())) {
243243
executorWrapper.setThreadPoolAliasName(props.getThreadPoolAliasName());
244244
}
245-
246245
ExecutorAdapter<?> executor = executorWrapper.getExecutor();
247246
// update reject handler
248247
String currentRejectHandlerType = executor.getRejectHandlerType();

core/src/main/java/org/dromara/dynamictp/core/aware/MetricsAware.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
package org.dromara.dynamictp.core.aware;
1919

20-
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
20+
import org.dromara.dynamictp.common.entity.ExecutorStats;
2121

2222
import java.util.Collections;
2323
import java.util.List;
@@ -31,20 +31,20 @@
3131
public interface MetricsAware extends DtpAware {
3232

3333
/**
34-
* Get thread pool stats.
34+
* Get executors stats.
3535
*
36-
* @return the thread pool stats
36+
* @return the executors stats
3737
*/
38-
default ThreadPoolStats getPoolStats() {
38+
default ExecutorStats getExecutorStats() {
3939
return null;
4040
}
4141

4242
/**
43-
* Get multi thread pool stats.
43+
* Get multi executors stats.
4444
*
45-
* @return thead pools stats
45+
* @return executors stats
4646
*/
47-
default List<ThreadPoolStats> getMultiPoolStats() {
47+
default List<ExecutorStats> getMultiExecutorStats() {
4848
return Collections.emptyList();
4949
}
5050
}

core/src/main/java/org/dromara/dynamictp/core/converter/ExecutorConverter.java

+39-37
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
package org.dromara.dynamictp.core.converter;
1919

2020
import lombok.val;
21-
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
21+
import org.dromara.dynamictp.common.entity.ExecutorStats;
2222
import org.dromara.dynamictp.common.entity.TpMainFields;
2323
import org.dromara.dynamictp.core.executor.DtpExecutor;
2424
import org.dromara.dynamictp.core.monitor.PerformanceProvider;
@@ -53,51 +53,53 @@ public static TpMainFields toMainFields(ExecutorWrapper executorWrapper) {
5353
return mainFields;
5454
}
5555

56-
public static ThreadPoolStats toMetrics(ExecutorWrapper wrapper) {
56+
public static ExecutorStats toMetrics(ExecutorWrapper wrapper) {
5757
ExecutorAdapter<?> executor = wrapper.getExecutor();
5858
if (executor == null) {
5959
return null;
6060
}
6161
ThreadPoolStatProvider provider = wrapper.getThreadPoolStatProvider();
6262
PerformanceProvider performanceProvider = provider.getPerformanceProvider();
6363
val performanceSnapshot = performanceProvider.getSnapshotAndReset();
64-
ThreadPoolStats poolStats = convertCommon(executor);
65-
poolStats.setPoolName(wrapper.getThreadPoolName());
66-
poolStats.setPoolAliasName(wrapper.getThreadPoolAliasName());
67-
poolStats.setRunTimeoutCount(provider.getRunTimeoutCount());
68-
poolStats.setQueueTimeoutCount(provider.getQueueTimeoutCount());
69-
poolStats.setRejectCount(provider.getRejectedTaskCount());
70-
poolStats.setDynamic(executor instanceof DtpExecutor);
64+
ExecutorStats executorStats = convertCommon(executor);
65+
executorStats.setExecutorName(wrapper.getThreadPoolName());
66+
executorStats.setExecutorAliasName(wrapper.getThreadPoolAliasName());
67+
executorStats.setRunTimeoutCount(provider.getRunTimeoutCount());
68+
executorStats.setQueueTimeoutCount(provider.getQueueTimeoutCount());
69+
executorStats.setRejectCount(provider.getRejectedTaskCount());
7170

72-
poolStats.setTps(performanceSnapshot.getTps());
73-
poolStats.setAvg(performanceSnapshot.getAvg());
74-
poolStats.setMaxRt(performanceSnapshot.getMaxRt());
75-
poolStats.setMinRt(performanceSnapshot.getMinRt());
76-
poolStats.setTp50(performanceSnapshot.getTp50());
77-
poolStats.setTp75(performanceSnapshot.getTp75());
78-
poolStats.setTp90(performanceSnapshot.getTp90());
79-
poolStats.setTp95(performanceSnapshot.getTp95());
80-
poolStats.setTp99(performanceSnapshot.getTp99());
81-
poolStats.setTp999(performanceSnapshot.getTp999());
82-
return poolStats;
71+
executorStats.setVirtualExecutor(wrapper.isVirtualThreadExecutor());
72+
73+
executorStats.setDynamic(executor instanceof DtpExecutor);
74+
executorStats.setTps(performanceSnapshot.getTps());
75+
executorStats.setAvg(performanceSnapshot.getAvg());
76+
executorStats.setMaxRt(performanceSnapshot.getMaxRt());
77+
executorStats.setMinRt(performanceSnapshot.getMinRt());
78+
executorStats.setTp50(performanceSnapshot.getTp50());
79+
executorStats.setTp75(performanceSnapshot.getTp75());
80+
executorStats.setTp90(performanceSnapshot.getTp90());
81+
executorStats.setTp95(performanceSnapshot.getTp95());
82+
executorStats.setTp99(performanceSnapshot.getTp99());
83+
executorStats.setTp999(performanceSnapshot.getTp999());
84+
return executorStats;
8385
}
8486

85-
private static ThreadPoolStats convertCommon(ExecutorAdapter<?> executor) {
86-
ThreadPoolStats poolStats = new ThreadPoolStats();
87-
poolStats.setCorePoolSize(executor.getCorePoolSize());
88-
poolStats.setMaximumPoolSize(executor.getMaximumPoolSize());
89-
poolStats.setPoolSize(executor.getPoolSize());
90-
poolStats.setActiveCount(executor.getActiveCount());
91-
poolStats.setLargestPoolSize(executor.getLargestPoolSize());
92-
poolStats.setQueueType(executor.getQueueType());
93-
poolStats.setQueueCapacity(executor.getQueueCapacity());
94-
poolStats.setQueueSize(executor.getQueueSize());
95-
poolStats.setQueueRemainingCapacity(executor.getQueueRemainingCapacity());
96-
poolStats.setTaskCount(executor.getTaskCount());
97-
poolStats.setCompletedTaskCount(executor.getCompletedTaskCount());
98-
poolStats.setWaitTaskCount(executor.getQueueSize());
99-
poolStats.setRejectHandlerName(executor.getRejectHandlerType());
100-
poolStats.setKeepAliveTime(executor.getKeepAliveTime(TimeUnit.MILLISECONDS));
101-
return poolStats;
87+
private static ExecutorStats convertCommon(ExecutorAdapter<?> executor) {
88+
ExecutorStats executorStats = new ExecutorStats();
89+
executorStats.setCorePoolSize(executor.getCorePoolSize());
90+
executorStats.setMaximumPoolSize(executor.getMaximumPoolSize());
91+
executorStats.setPoolSize(executor.getPoolSize());
92+
executorStats.setActiveCount(executor.getActiveCount());
93+
executorStats.setLargestPoolSize(executor.getLargestPoolSize());
94+
executorStats.setQueueType(executor.getQueueType());
95+
executorStats.setQueueCapacity(executor.getQueueCapacity());
96+
executorStats.setQueueSize(executor.getQueueSize());
97+
executorStats.setQueueRemainingCapacity(executor.getQueueRemainingCapacity());
98+
executorStats.setTaskCount(executor.getTaskCount());
99+
executorStats.setCompletedTaskCount(executor.getCompletedTaskCount());
100+
executorStats.setWaitTaskCount(executor.getQueueSize());
101+
executorStats.setRejectHandlerName(executor.getRejectHandlerType());
102+
executorStats.setKeepAliveTime(executor.getKeepAliveTime(TimeUnit.MILLISECONDS));
103+
return executorStats;
102104
}
103105
}

core/src/main/java/org/dromara/dynamictp/core/executor/ExecutorType.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.dromara.dynamictp.core.executor.eager.EagerDtpExecutor;
2222
import lombok.Getter;
2323
import org.dromara.dynamictp.core.executor.priority.PriorityDtpExecutor;
24+
import org.dromara.dynamictp.core.support.proxy.VirtualThreadExecutorProxy;
2425

2526
/**
2627
* ExecutorType related
@@ -55,7 +56,12 @@ public enum ExecutorType {
5556
/**
5657
* Priority executor type.
5758
*/
58-
PRIORITY("priority", PriorityDtpExecutor.class);
59+
PRIORITY("priority", PriorityDtpExecutor.class),
60+
61+
/**
62+
* Virtual thread executor adapter type.
63+
*/
64+
VIRTUAL("virtual", VirtualThreadExecutorProxy.class);
5965

6066
private final String name;
6167

core/src/main/java/org/dromara/dynamictp/core/handler/CollectorHandler.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import com.google.common.collect.Maps;
2121
import lombok.extern.slf4j.Slf4j;
22-
import org.dromara.dynamictp.common.entity.ThreadPoolStats;
22+
import org.dromara.dynamictp.common.entity.ExecutorStats;
2323
import org.dromara.dynamictp.common.util.ExtensionServiceLoader;
2424
import org.dromara.dynamictp.core.monitor.collector.InternalLogCollector;
2525
import org.dromara.dynamictp.core.monitor.collector.LogCollector;
@@ -56,14 +56,14 @@ private CollectorHandler() {
5656
COLLECTORS.put(jmxCollector.type(), jmxCollector);
5757
}
5858

59-
public void collect(ThreadPoolStats poolStats, List<String> types) {
60-
if (poolStats == null || CollectionUtils.isEmpty(types)) {
59+
public void collect(ExecutorStats executorStats, List<String> types) {
60+
if (executorStats == null || CollectionUtils.isEmpty(types)) {
6161
return;
6262
}
6363
for (String collectorType : types) {
6464
MetricsCollector collector = COLLECTORS.get(collectorType.toLowerCase());
6565
if (collector != null) {
66-
collector.collect(poolStats);
66+
collector.collect(executorStats);
6767
}
6868
}
6969
}

0 commit comments

Comments
 (0)