From fbdb9c1bb1a0ae7dfa77d534b4bbb55e5dddbd44 Mon Sep 17 00:00:00 2001 From: lightClouds917 Date: Tue, 4 Mar 2025 20:06:27 +0800 Subject: [PATCH] optimize the interface --- .../seata/saga/engine/pcext/utils/LoopContextHolder.java | 6 +++++- .../java/org/apache/seata/saga/proctrl/ProcessContext.java | 7 ------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java index d0686124ae5..6702a71fc9a 100644 --- a/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java +++ b/saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/utils/LoopContextHolder.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.Stack; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import org.apache.seata.common.lock.ResourceLock; @@ -39,19 +40,22 @@ public class LoopContextHolder { private final Stack forwardCounterStack = new Stack<>(); private Collection collection; private final ResourceLock lock = new ResourceLock(); + private static final ConcurrentHashMap LOCK_MAP = new ConcurrentHashMap<>(); public static LoopContextHolder getCurrent(ProcessContext context, boolean forceCreate) { LoopContextHolder loopContextHolder = (LoopContextHolder)context.getVariable( DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER); if (null == loopContextHolder && forceCreate) { - try (ResourceLock ignored = context.getLock().obtain()) { + try (ResourceLock ignored = LOCK_MAP.computeIfAbsent(context, k -> new ResourceLock()).obtain()) { loopContextHolder = (LoopContextHolder)context.getVariable( DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER); if (null == loopContextHolder) { loopContextHolder = new LoopContextHolder(); context.setVariable(DomainConstants.VAR_NAME_CURRENT_LOOP_CONTEXT_HOLDER, loopContextHolder); } + } finally { + LOCK_MAP.remove(context); } } return loopContextHolder; diff --git a/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java b/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java index b8d588f9291..69b3762777d 100644 --- a/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java +++ b/saga/seata-saga-processctrl/src/main/java/org/apache/seata/saga/proctrl/ProcessContext.java @@ -16,8 +16,6 @@ */ package org.apache.seata.saga.proctrl; -import org.apache.seata.common.lock.ResourceLock; - import java.util.Map; /** @@ -97,9 +95,4 @@ public interface ProcessContext { */ T getInstruction(Class clazz); - /** - * Gets get lock. - * @return the lock of the current process context - */ - ResourceLock getLock(); }