diff --git a/example/src/main/resources/application.yml b/example/src/main/resources/application.yml index 4ef2c80a..604b6c2b 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 094c5a76..586ed1e0 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 eec543c8..850e6706 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 b2b0ebf7..1c1ee7a7 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 e72e7b23..07007a25 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 d0a0d353..b2dccbbb 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);