From 39abb2537396da661abbd4404e8d5808c08bcf63 Mon Sep 17 00:00:00 2001 From: byteblogs168 <598092184@qq.com> Date: Sat, 14 Jan 2023 20:45:32 +0800 Subject: [PATCH] =?UTF-8?q?0.0.2.0=20=E4=BF=AE=E5=A4=8D=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E9=87=8D=E8=AF=95=E6=9C=AA=E5=BC=80=E5=90=AF=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=93=8D=E5=BA=94=E5=A4=B4=E6=9C=AA=E4=BC=A0=E9=80=92?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/src/main/resources/application.yml | 2 +- .../client/core/intercepter/HeaderAspect.java | 34 ++++++++++++++++--- .../client/core/intercepter/RetryAspect.java | 11 ++++++ .../core/intercepter/RetrySiteSnapshot.java | 4 +-- .../core/strategy/LocalRetryStrategies.java | 2 +- .../dispatch/actor/exec/ExecUnitActor.java | 2 ++ 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/example/src/main/resources/application.yml b/example/src/main/resources/application.yml index 4ef2c80af..604b6c2b5 100644 --- a/example/src/main/resources/application.yml +++ b/example/src/main/resources/application.yml @@ -38,4 +38,4 @@ logging: x-retry: server: - host: 127.0.0.1 + host: 192.168.100.3 diff --git a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/HeaderAspect.java b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/HeaderAspect.java index 094c5a76a..586ed1e08 100644 --- a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/HeaderAspect.java +++ b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/HeaderAspect.java @@ -6,7 +6,9 @@ import com.x.retry.common.core.model.XRetryHeaders; import com.x.retry.common.core.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @@ -17,17 +19,17 @@ import javax.servlet.http.HttpServletResponse; import java.util.Objects; /** + * 请求头和响应头传递 + * * @author: shuguang.zhang * @date : 2022-04-18 09:19 */ - @Aspect @Component @Slf4j public class HeaderAspect { - @Before(value = "@within(org.springframework.web.bind.annotation.RestController)") - public void before(JoinPoint joinPoint){ + public void before(){ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); String xRetry = attributes.getRequest().getHeader(SystemConstants.X_RETRY_HEAD_KEY); if (Objects.nonNull(xRetry)) { @@ -39,8 +41,30 @@ public class HeaderAspect { } } - @AfterReturning(pointcut = "@within(org.springframework.web.bind.annotation.RestController)", returning = "o") - public void afterReturning(Object o) { + @Around(value = "@within(org.springframework.web.bind.annotation.RestController)") + public Object around(ProceedingJoinPoint point) throws Throwable { + + before(); + + Throwable throwable = null; + Object result = null; + try { + result = point.proceed(); + } catch (Throwable t) { + throwable = t; + } finally { + afterReturning(); + } + + if (throwable != null) { + throw throwable; + } else { + return result; + } + } + + public void afterReturning() { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletResponse response = attributes.getResponse(); response.addHeader(SystemConstants.X_RETRY_STATUS_CODE_KEY, RetrySiteSnapshot.getRetryStatusCode()); diff --git a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java index eec543c83..850e67069 100644 --- a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java +++ b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetryAspect.java @@ -1,12 +1,14 @@ package com.x.retry.client.core.intercepter; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSON; import com.x.retry.client.core.annotation.Retryable; import com.x.retry.client.core.exception.XRetryClientException; import com.x.retry.client.core.retryer.RetryerResultContext; import com.x.retry.client.core.strategy.RetryStrategy; import com.x.retry.common.core.enums.RetryResultStatusEnum; import com.x.retry.common.core.log.LogUtils; +import com.x.retry.common.core.util.JsonUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -79,6 +81,13 @@ public class RetryAspect { // 下游响应不重试码,不开启重试 || RetrySiteSnapshot.isRetryForStatusCode() ) { + LogUtils.info("校验不通过不开启重试 methodEntrance:[{}] isRunning:[{}] throwable:[{}] isRetryFlow:[{}] isRetryForStatusCode:[{}]" , + !RetrySiteSnapshot.isMethodEntrance(methodEntrance), + RetrySiteSnapshot.isRunning(), + Objects.isNull(throwable), + RetrySiteSnapshot.isRetryFlow(), + RetrySiteSnapshot.isRetryForStatusCode() + ); return; } @@ -103,6 +112,8 @@ public class RetryAspect { try { RetryerResultContext context = retryStrategy.openRetry(retryable.scene(), executorClassName, point.getArgs()); + LogUtils.info("本地重试结果 message:[{}]", context); + if (RetryResultStatusEnum.SUCCESS.getStatus().equals(context.getRetryResultStatusEnum().getStatus())) { LogUtils.debug("aop 结果成功 traceId:[{}] result:[{}]", traceId, context.getResult()); } diff --git a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetrySiteSnapshot.java b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetrySiteSnapshot.java index b2b0ebf7b..1c1ee7a7c 100644 --- a/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetrySiteSnapshot.java +++ b/x-retry-client-core/src/main/java/com/x/retry/client/core/intercepter/RetrySiteSnapshot.java @@ -105,7 +105,7 @@ public class RetrySiteSnapshot { } public static boolean isRetryForStatusCode() { - return getRetryStatusCode().equals(SystemConstants.X_RETRY_STATUS_CODE); + return Objects.nonNull(getRetryStatusCode()) && getRetryStatusCode().equals(SystemConstants.X_RETRY_STATUS_CODE); } public static Long getEntryMethodTime() { @@ -134,8 +134,6 @@ public class RetrySiteSnapshot { RETRY_STATUS.remove(); RETRY_CLASS_METHOD_ENTRANCE.remove(); RETRY_STAGE.remove(); - RETRY_HEADER.remove(); - RETRY_STATUS_CODE.remove(); } diff --git a/x-retry-client-core/src/main/java/com/x/retry/client/core/strategy/LocalRetryStrategies.java b/x-retry-client-core/src/main/java/com/x/retry/client/core/strategy/LocalRetryStrategies.java index e72e7b23c..07007a254 100644 --- a/x-retry-client-core/src/main/java/com/x/retry/client/core/strategy/LocalRetryStrategies.java +++ b/x-retry-client-core/src/main/java/com/x/retry/client/core/strategy/LocalRetryStrategies.java @@ -71,7 +71,7 @@ public class LocalRetryStrategies extends AbstractRetryStrategies { return false; } - if (!RetrySiteSnapshot.isRetryForStatusCode()) { + if (RetrySiteSnapshot.isRetryForStatusCode()) { resultContext.setRetryResultStatusEnum(RetryResultStatusEnum.FAILURE); resultContext.setMessage("执行重试检验不通过 原因: 下游标志禁止重试"); return false; diff --git a/x-retry-server/src/main/java/com/x/retry/server/support/dispatch/actor/exec/ExecUnitActor.java b/x-retry-server/src/main/java/com/x/retry/server/support/dispatch/actor/exec/ExecUnitActor.java index d0a0d353a..b2dccbbb9 100644 --- a/x-retry-server/src/main/java/com/x/retry/server/support/dispatch/actor/exec/ExecUnitActor.java +++ b/x-retry-server/src/main/java/com/x/retry/server/support/dispatch/actor/exec/ExecUnitActor.java @@ -1,6 +1,7 @@ package com.x.retry.server.support.dispatch.actor.exec; import akka.actor.AbstractActor; +import cn.hutool.core.util.IdUtil; import com.x.retry.client.model.DispatchRetryDTO; import com.x.retry.client.model.DispatchRetryResultDTO; import com.x.retry.common.core.constant.SystemConstants; @@ -112,6 +113,7 @@ public class ExecUnitActor extends AbstractActor { HttpHeaders requestHeaders = new HttpHeaders(); XRetryHeaders xRetryHeaders = new XRetryHeaders(); xRetryHeaders.setXRetry(Boolean.TRUE); + xRetryHeaders.setXRetryId(IdUtil.simpleUUID()); requestHeaders.add(SystemConstants.X_RETRY_HEAD_KEY, JsonUtil.toJsonString(xRetryHeaders)); HttpEntity requestEntity = new HttpEntity<>(dispatchRetryDTO, requestHeaders);