0.0.2.0
修复本地重试未开启 修复响应头未传递异常
This commit is contained in:
		
							parent
							
								
									27c927c845
								
							
						
					
					
						commit
						39abb25373
					
				@ -38,4 +38,4 @@ logging:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
x-retry:
 | 
					x-retry:
 | 
				
			||||||
  server:
 | 
					  server:
 | 
				
			||||||
    host: 127.0.0.1
 | 
					    host: 192.168.100.3
 | 
				
			||||||
 | 
				
			|||||||
@ -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());
 | 
				
			||||||
 | 
				
			|||||||
@ -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());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
				
			|||||||
@ -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();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user