From 310d9bc580a0a09268a27f6e424efd968a06bf80 Mon Sep 17 00:00:00 2001 From: opensnail <598092184@qq.com> Date: Fri, 18 Apr 2025 22:43:20 +0800 Subject: [PATCH] =?UTF-8?q?fix(1.5.0-beta1):=20=E4=BF=AE=E5=A4=8D=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E4=BC=A0=E6=92=AD=E6=9C=BA=E5=88=B6=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=AC=A1=E6=95=B0=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/intercepter/RetrySiteSnapshot.java | 30 +++++++++++++++++-- .../intercepter/SnailRetryInterceptor.java | 17 ++++++++++- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/RetrySiteSnapshot.java b/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/RetrySiteSnapshot.java index d0543fbf7..ee1adace3 100644 --- a/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/RetrySiteSnapshot.java +++ b/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/RetrySiteSnapshot.java @@ -8,9 +8,7 @@ import com.aizuda.snailjob.common.core.model.SnailJobHeaders; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.Deque; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.concurrent.LinkedBlockingDeque; /** @@ -21,6 +19,10 @@ import java.util.concurrent.LinkedBlockingDeque; */ public class RetrySiteSnapshot { + private static final String RETRY_STAGE_KEY = "RETRY_STAGE"; + private static final String RETRY_CLASS_METHOD_ENTRANCE_KEY = "RETRY_CLASS_METHOD_ENTRANCE"; + private static final String RETRY_STATUS_KEY = "RETRY_STATUS"; + /** * 重试阶段,1-内存重试阶段,2-服务端重试阶段 */ @@ -46,11 +48,33 @@ public class RetrySiteSnapshot { */ private static final RetrySiteSnapshotContext RETRY_STATUS_CODE = SnailRetrySpiLoader.loadRetrySiteSnapshotContext(); + /** + * 挂起重试的内存状态 + */ + private static final RetrySiteSnapshotContext> SUSPEND = SnailRetrySpiLoader.loadRetrySiteSnapshotContext(); + /** * 进入方法入口时间标记 */ private static final RetrySiteSnapshotContext ENTRY_METHOD_TIME = SnailRetrySpiLoader.loadRetrySiteSnapshotContext(); + public static void suspend() { + SUSPEND.set(new HashMap<>(){{ + put(RETRY_STAGE_KEY, RETRY_STAGE.get()); + put(RETRY_STATUS_KEY, RETRY_STATUS.get()); + put(RETRY_CLASS_METHOD_ENTRANCE_KEY, RETRY_CLASS_METHOD_ENTRANCE.get()); + }}); + } + + public static void restore() { + Optional.ofNullable(SUSPEND.get()).ifPresent(map -> { + RETRY_STAGE.set((Integer) map.get(RETRY_STAGE_KEY)); + RETRY_STATUS.set((Integer) map.get(RETRY_STATUS_KEY)); + RETRY_CLASS_METHOD_ENTRANCE.set((Deque) map.get(RETRY_CLASS_METHOD_ENTRANCE_KEY)); + SUSPEND.remove(); + }); + } + public static Integer getStage() { return RETRY_STAGE.get(); } diff --git a/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/SnailRetryInterceptor.java b/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/SnailRetryInterceptor.java index 3f8b80ad9..cead4f318 100644 --- a/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/SnailRetryInterceptor.java +++ b/snail-job-client/snail-job-client-retry-core/src/main/java/com/aizuda/snailjob/client/core/intercepter/SnailRetryInterceptor.java @@ -74,7 +74,18 @@ public class SnailRetryInterceptor implements MethodInterceptor, AfterAdvice, Se String methodEntrance = getMethodEntrance(retryable, executorClassName); if (Propagation.REQUIRES_NEW.equals(retryable.propagation())) { - RetrySiteSnapshot.setMethodEntrance(methodEntrance); + // 如果已经是入口了就不需要继续添加入口了 + if (!RetrySiteSnapshot.isMethodEntrance(methodEntrance)) { + // 这里需要挂起外部重试的内存的信息 + if (RetrySiteSnapshot.isRunning() + && RetrySiteSnapshot.getStage() == RetrySiteSnapshot.EnumStage.LOCAL.getStage()) { + RetrySiteSnapshot.suspend(); + // 清除线程信息 + RetrySiteSnapshot.removeAll(); + } + // 设置新的内容信息 + RetrySiteSnapshot.setMethodEntrance(methodEntrance); + } } else if (!RetrySiteSnapshot.existedMethodEntrance()) { RetrySiteSnapshot.setMethodEntrance(methodEntrance); } else { @@ -195,7 +206,11 @@ public class SnailRetryInterceptor implements MethodInterceptor, AfterAdvice, Se sendMessage(e); } finally { + // 清除当前重试的信息 RetrySiteSnapshot.removeAll(); + // 还原挂起的信息 + RetrySiteSnapshot.restore(); + } return null;