diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java index 11d082ecc..74c3717b3 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java @@ -570,13 +570,18 @@ public class Node implements Executable, Cloneable, Rollbackable{ if (parentValue == null) { return null; } - // 克隆 Stack - return (Stack>) parentValue.clone(); + + Stack> newStack = new Stack<>(); + for (TupleOf2 tuple : parentValue) { + newStack.push(new TupleOf2<>(tuple.getA(), tuple.getB())); + } + + return newStack; } }; node.loopObjectTL = new TransmittableThreadLocal>>() { /** - * 在你提供的这个 TTL 版本中,我们重写 public T copy(T parentValue) 方法 + * 我们重写 public T copy(T parentValue) 方法 * 来实现 Stack 的克隆,以确保线程隔离。 */ @Override @@ -585,8 +590,13 @@ public class Node implements Executable, Cloneable, Rollbackable{ if (parentValue == null) { return null; } - // 克隆 Stack - return (Stack>) parentValue.clone(); + + Stack> newStack = new Stack<>(); + for (TupleOf2 tuple : parentValue) { + newStack.push(new TupleOf2<>(tuple.getA(), tuple.getB())); + } + + return newStack; } }; node.accessResult = new TransmittableThreadLocal<>(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java index 0418a13dc..4bceefbb5 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java @@ -125,12 +125,12 @@ public class Slot { } private void putThreadMetaDataMap(String key, T t) { - String threadKey = StrUtil.format("{}_{}", key, Thread.currentThread().getName()); + String threadKey = StrUtil.format("{}_{}", key, Thread.currentThread().getId()); putMetaDataMap(threadKey, t); } private T getThreadMetaData(String key) { - String threadKey = StrUtil.format("{}_{}", key, Thread.currentThread().getName()); + String threadKey = StrUtil.format("{}_{}", key, Thread.currentThread().getId()); return (T) metaDataMap.get(threadKey); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorBuilder.java index b0859e0bc..d277956a5 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorBuilder.java @@ -24,7 +24,7 @@ public interface ExecutorBuilder { if (ExecutorHelper.loadInstance().isEnabledVirtualThreads()){ Method method = ReflectUtil.getMethodByName(Executors.class, "newVirtualThreadPerTaskExecutor"); - executorService = ReflectUtil.invokeStatic(method); + executorService = TtlExecutors.getTtlExecutorService(ReflectUtil.invokeStatic(method)); }else{ executorService = TtlExecutors.getTtlExecutorService(new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueCapacity), new ThreadFactory() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java index e79f702f1..d27618963 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/thread/ExecutorHelper.java @@ -216,9 +216,14 @@ public class ExecutorHelper { return executor; } + private Boolean isEnabledVirtualThreadsCache; + public boolean isEnabledVirtualThreads(){ - LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); - return BooleanUtil.isTrue(liteflowConfig.getEnableVirtualThread() && JdkUtil.JVM_VERSION == 21); + if (isEnabledVirtualThreadsCache == null){ + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + isEnabledVirtualThreadsCache = BooleanUtil.isTrue(liteflowConfig.getEnableVirtualThread() && JdkUtil.JVM_VERSION == 21); + } + return isEnabledVirtualThreadsCache; } }