diff --git a/easy-retry-client/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/intercepter/RetrySiteSnapshot.java b/easy-retry-client/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/intercepter/RetrySiteSnapshot.java index 1ce2cd10..40408d09 100644 --- a/easy-retry-client/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/intercepter/RetrySiteSnapshot.java +++ b/easy-retry-client/easy-retry-client-core/src/main/java/com/aizuda/easy/retry/client/core/intercepter/RetrySiteSnapshot.java @@ -8,8 +8,11 @@ import com.aizuda.easy.retry.common.core.constant.SystemConstants; import com.aizuda.easy.retry.common.core.model.EasyRetryHeaders; import lombok.Getter; +import java.util.Deque; import java.util.Objects; import java.util.Optional; +import java.util.Stack; +import java.util.concurrent.LinkedBlockingDeque; /** * 重试现场记录器 @@ -27,7 +30,7 @@ public class RetrySiteSnapshot { /** * 标记重试方法入口 */ - private static final RetrySiteSnapshotContext RETRY_CLASS_METHOD_ENTRANCE = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); + private static final RetrySiteSnapshotContext> RETRY_CLASS_METHOD_ENTRANCE = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); /** * 重试状态 @@ -37,18 +40,18 @@ public class RetrySiteSnapshot { /** * 重试请求头 */ - private static final RetrySiteSnapshotContext RETRY_HEADER = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); + private static final RetrySiteSnapshotContext RETRY_HEADER = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); /** * 状态码 */ - private static final RetrySiteSnapshotContext RETRY_STATUS_CODE = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); + private static final RetrySiteSnapshotContext RETRY_STATUS_CODE = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); /** * 进入方法入口时间标记 */ - private static final RetrySiteSnapshotContext ENTRY_METHOD_TIME = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); - private static final RetrySiteSnapshotContext ATTEMPT_NUMBER = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); + private static final RetrySiteSnapshotContext ENTRY_METHOD_TIME = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); + private static final RetrySiteSnapshotContext ATTEMPT_NUMBER = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(); public static Integer getAttemptNumber() { return ATTEMPT_NUMBER.get(); @@ -71,15 +74,32 @@ public class RetrySiteSnapshot { } public static String getMethodEntrance() { - return RETRY_CLASS_METHOD_ENTRANCE.get(); + Deque stack = RETRY_CLASS_METHOD_ENTRANCE.get(); + return stack.peek(); } public static void setMethodEntrance(String methodEntrance) { - RETRY_CLASS_METHOD_ENTRANCE.set(methodEntrance); + Deque stack = RETRY_CLASS_METHOD_ENTRANCE.get(); + if (Objects.isNull(RETRY_CLASS_METHOD_ENTRANCE.get())) { + stack = new LinkedBlockingDeque<>(); + } + + stack.push(methodEntrance); + RETRY_CLASS_METHOD_ENTRANCE.set(stack); } public static void removeMethodEntrance() { - RETRY_CLASS_METHOD_ENTRANCE.remove(); + Deque stack = RETRY_CLASS_METHOD_ENTRANCE.get(); + if (Objects.isNull(stack)) { + return; + } + + if (stack.isEmpty()) { + RETRY_CLASS_METHOD_ENTRANCE.remove(); + return; + } + + stack.pop(); } public static boolean isMethodEntrance(String methodEntrance) {