修复本地重试未开启
修复响应头未传递异常
This commit is contained in:
byteblogs168 2023-01-14 20:45:32 +08:00
parent 27c927c845
commit 39abb25373
6 changed files with 45 additions and 10 deletions

View File

@ -38,4 +38,4 @@ logging:
x-retry: x-retry:
server: server:
host: 127.0.0.1 host: 192.168.100.3

View File

@ -6,7 +6,9 @@ import com.x.retry.common.core.model.XRetryHeaders;
import com.x.retry.common.core.util.JsonUtil; import com.x.retry.common.core.util.JsonUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -17,17 +19,17 @@ import javax.servlet.http.HttpServletResponse;
import java.util.Objects; import java.util.Objects;
/** /**
* 请求头和响应头传递
*
* @author: shuguang.zhang * @author: shuguang.zhang
* @date : 2022-04-18 09:19 * @date : 2022-04-18 09:19
*/ */
@Aspect @Aspect
@Component @Component
@Slf4j @Slf4j
public class HeaderAspect { public class HeaderAspect {
@Before(value = "@within(org.springframework.web.bind.annotation.RestController)") public void before(){
public void before(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String xRetry = attributes.getRequest().getHeader(SystemConstants.X_RETRY_HEAD_KEY); String xRetry = attributes.getRequest().getHeader(SystemConstants.X_RETRY_HEAD_KEY);
if (Objects.nonNull(xRetry)) { if (Objects.nonNull(xRetry)) {
@ -39,8 +41,30 @@ public class HeaderAspect {
} }
} }
@AfterReturning(pointcut = "@within(org.springframework.web.bind.annotation.RestController)", returning = "o") @Around(value = "@within(org.springframework.web.bind.annotation.RestController)")
public void afterReturning(Object o) { 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(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = attributes.getResponse(); HttpServletResponse response = attributes.getResponse();
response.addHeader(SystemConstants.X_RETRY_STATUS_CODE_KEY, RetrySiteSnapshot.getRetryStatusCode()); response.addHeader(SystemConstants.X_RETRY_STATUS_CODE_KEY, RetrySiteSnapshot.getRetryStatusCode());

View File

@ -1,12 +1,14 @@
package com.x.retry.client.core.intercepter; package com.x.retry.client.core.intercepter;
import cn.hutool.core.util.StrUtil; 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.annotation.Retryable;
import com.x.retry.client.core.exception.XRetryClientException; import com.x.retry.client.core.exception.XRetryClientException;
import com.x.retry.client.core.retryer.RetryerResultContext; import com.x.retry.client.core.retryer.RetryerResultContext;
import com.x.retry.client.core.strategy.RetryStrategy; import com.x.retry.client.core.strategy.RetryStrategy;
import com.x.retry.common.core.enums.RetryResultStatusEnum; import com.x.retry.common.core.enums.RetryResultStatusEnum;
import com.x.retry.common.core.log.LogUtils; import com.x.retry.common.core.log.LogUtils;
import com.x.retry.common.core.util.JsonUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
@ -79,6 +81,13 @@ public class RetryAspect {
// 下游响应不重试码不开启重试 // 下游响应不重试码不开启重试
|| RetrySiteSnapshot.isRetryForStatusCode() || RetrySiteSnapshot.isRetryForStatusCode()
) { ) {
LogUtils.info("校验不通过不开启重试 methodEntrance:[{}] isRunning:[{}] throwable:[{}] isRetryFlow:[{}] isRetryForStatusCode:[{}]" ,
!RetrySiteSnapshot.isMethodEntrance(methodEntrance),
RetrySiteSnapshot.isRunning(),
Objects.isNull(throwable),
RetrySiteSnapshot.isRetryFlow(),
RetrySiteSnapshot.isRetryForStatusCode()
);
return; return;
} }
@ -103,6 +112,8 @@ public class RetryAspect {
try { try {
RetryerResultContext context = retryStrategy.openRetry(retryable.scene(), executorClassName, point.getArgs()); RetryerResultContext context = retryStrategy.openRetry(retryable.scene(), executorClassName, point.getArgs());
LogUtils.info("本地重试结果 message:[{}]", context);
if (RetryResultStatusEnum.SUCCESS.getStatus().equals(context.getRetryResultStatusEnum().getStatus())) { if (RetryResultStatusEnum.SUCCESS.getStatus().equals(context.getRetryResultStatusEnum().getStatus())) {
LogUtils.debug("aop 结果成功 traceId:[{}] result:[{}]", traceId, context.getResult()); LogUtils.debug("aop 结果成功 traceId:[{}] result:[{}]", traceId, context.getResult());
} }

View File

@ -105,7 +105,7 @@ public class RetrySiteSnapshot {
} }
public static boolean isRetryForStatusCode() { 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() { public static Long getEntryMethodTime() {
@ -134,8 +134,6 @@ public class RetrySiteSnapshot {
RETRY_STATUS.remove(); RETRY_STATUS.remove();
RETRY_CLASS_METHOD_ENTRANCE.remove(); RETRY_CLASS_METHOD_ENTRANCE.remove();
RETRY_STAGE.remove(); RETRY_STAGE.remove();
RETRY_HEADER.remove();
RETRY_STATUS_CODE.remove();
} }

View File

@ -71,7 +71,7 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
return false; return false;
} }
if (!RetrySiteSnapshot.isRetryForStatusCode()) { if (RetrySiteSnapshot.isRetryForStatusCode()) {
resultContext.setRetryResultStatusEnum(RetryResultStatusEnum.FAILURE); resultContext.setRetryResultStatusEnum(RetryResultStatusEnum.FAILURE);
resultContext.setMessage("执行重试检验不通过 原因: 下游标志禁止重试"); resultContext.setMessage("执行重试检验不通过 原因: 下游标志禁止重试");
return false; return false;

View File

@ -1,6 +1,7 @@
package com.x.retry.server.support.dispatch.actor.exec; package com.x.retry.server.support.dispatch.actor.exec;
import akka.actor.AbstractActor; import akka.actor.AbstractActor;
import cn.hutool.core.util.IdUtil;
import com.x.retry.client.model.DispatchRetryDTO; import com.x.retry.client.model.DispatchRetryDTO;
import com.x.retry.client.model.DispatchRetryResultDTO; import com.x.retry.client.model.DispatchRetryResultDTO;
import com.x.retry.common.core.constant.SystemConstants; import com.x.retry.common.core.constant.SystemConstants;
@ -112,6 +113,7 @@ public class ExecUnitActor extends AbstractActor {
HttpHeaders requestHeaders = new HttpHeaders(); HttpHeaders requestHeaders = new HttpHeaders();
XRetryHeaders xRetryHeaders = new XRetryHeaders(); XRetryHeaders xRetryHeaders = new XRetryHeaders();
xRetryHeaders.setXRetry(Boolean.TRUE); xRetryHeaders.setXRetry(Boolean.TRUE);
xRetryHeaders.setXRetryId(IdUtil.simpleUUID());
requestHeaders.add(SystemConstants.X_RETRY_HEAD_KEY, JsonUtil.toJsonString(xRetryHeaders)); requestHeaders.add(SystemConstants.X_RETRY_HEAD_KEY, JsonUtil.toJsonString(xRetryHeaders));
HttpEntity<DispatchRetryDTO> requestEntity = new HttpEntity<>(dispatchRetryDTO, requestHeaders); HttpEntity<DispatchRetryDTO> requestEntity = new HttpEntity<>(dispatchRetryDTO, requestHeaders);