feat(1.0.0): retry模块类命名优化

This commit is contained in:
opensnail 2024-04-16 16:32:43 +08:00
parent 2c8a158be4
commit 850d2cab36
18 changed files with 105 additions and 178 deletions

View File

@ -1,12 +1,8 @@
package com.aizuda.snailjob.client.starter; package com.aizuda.snailjob.client.starter;
import com.aizuda.snailjob.client.core.annotation.Retryable; import com.aizuda.snailjob.client.core.annotation.Retryable;
import com.aizuda.snailjob.client.core.intercepter.SnailJobInterceptor; import com.aizuda.snailjob.client.core.intercepter.SnailRetryInterceptor;
import com.aizuda.snailjob.client.core.intercepter.SnailJobPointcutAdvisor; import com.aizuda.snailjob.client.core.intercepter.SnailRetryPointcutAdvisor;
import com.aizuda.snailjob.client.core.strategy.RetryStrategy;
import com.aizuda.snailjob.client.core.annotation.Retryable;
import com.aizuda.snailjob.client.core.intercepter.SnailJobInterceptor;
import com.aizuda.snailjob.client.core.intercepter.SnailJobPointcutAdvisor;
import com.aizuda.snailjob.client.core.strategy.RetryStrategy; import com.aizuda.snailjob.client.core.strategy.RetryStrategy;
import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.Advisor; import org.springframework.aop.Advisor;
@ -26,14 +22,14 @@ public class SnailJobClientRetryCoreAutoConfiguration {
@Bean @Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE) @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public Advisor snailJobPointcutAdvisor(MethodInterceptor snailJobInterceptor) { public Advisor snailJobPointcutAdvisor(MethodInterceptor snailJobInterceptor) {
return new SnailJobPointcutAdvisor(snailJobInterceptor); return new SnailRetryPointcutAdvisor(snailJobInterceptor);
} }
@Bean @Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE) @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public MethodInterceptor snailJobInterceptor(StandardEnvironment standardEnvironment, public MethodInterceptor snailJobInterceptor(StandardEnvironment standardEnvironment,
@Lazy RetryStrategy localRetryStrategies) { @Lazy RetryStrategy localRetryStrategies) {
return new SnailJobInterceptor(standardEnvironment, localRetryStrategies); return new SnailRetryInterceptor(standardEnvironment, localRetryStrategies);
} }
} }

View File

@ -10,9 +10,9 @@ import com.aizuda.snailjob.client.core.RetryArgSerializer;
import com.aizuda.snailjob.client.common.cache.GroupVersionCache; import com.aizuda.snailjob.client.common.cache.GroupVersionCache;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache; import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.callback.RetryCompleteCallback; import com.aizuda.snailjob.client.core.callback.RetryCompleteCallback;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.loader.SnailJobSpiLoader; import com.aizuda.snailjob.client.core.loader.SnailRetrySpiLoader;
import com.aizuda.snailjob.client.core.log.RetryLogMeta; import com.aizuda.snailjob.client.core.log.RetryLogMeta;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext; import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
@ -31,17 +31,6 @@ import com.aizuda.snailjob.common.core.model.Result;
import com.aizuda.snailjob.common.core.util.JsonUtil; import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.enums.LogTypeEnum; import com.aizuda.snailjob.common.log.enums.LogTypeEnum;
import com.aizuda.snailjob.server.model.dto.ConfigDTO; import com.aizuda.snailjob.server.model.dto.ConfigDTO;
import com.aizuda.snailjob.client.common.log.support.SnailJobLogManager;
import com.aizuda.snailjob.client.common.rpc.client.RequestMethod;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.callback.RetryCompleteCallback;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.log.RetryLogMeta;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
import com.aizuda.snailjob.client.core.serializer.JacksonSerializer;
import com.aizuda.snailjob.client.core.strategy.RetryStrategy;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation; import jakarta.validation.Validation;
@ -64,7 +53,7 @@ import java.util.Set;
* @date : 2022-03-09 16:33 * @date : 2022-03-09 16:33
*/ */
@SnailEndPoint @SnailEndPoint
public class RetryEndPoint { public class SnailRetryEndPoint {
@Autowired @Autowired
@Qualifier("remoteRetryStrategies") @Qualifier("remoteRetryStrategies")
@ -86,11 +75,11 @@ public class RetryEndPoint {
RetryerInfo retryerInfo = RetryerInfoCache.get(executeReqDto.getScene(), executeReqDto.getExecutorName()); RetryerInfo retryerInfo = RetryerInfoCache.get(executeReqDto.getScene(), executeReqDto.getExecutorName());
if (Objects.isNull(retryerInfo)) { if (Objects.isNull(retryerInfo)) {
SnailJobLog.REMOTE.error("场景:[{}]配置不存在, 请检查您的场景和执行器是否存在", executeReqDto.getScene()); SnailJobLog.REMOTE.error("场景:[{}]配置不存在, 请检查您的场景和执行器是否存在", executeReqDto.getScene());
throw new SnailJobClientException("场景:[{}]配置不存在, 请检查您的场景和执行器是否存在", throw new SnailRetryClientException("场景:[{}]配置不存在, 请检查您的场景和执行器是否存在",
executeReqDto.getScene()); executeReqDto.getScene());
} }
RetryArgSerializer retryArgSerializer = SnailJobSpiLoader.loadRetryArgSerializer(); RetryArgSerializer retryArgSerializer = SnailRetrySpiLoader.loadRetryArgSerializer();
Object[] deSerialize; Object[] deSerialize;
try { try {
@ -98,7 +87,7 @@ public class RetryEndPoint {
retryerInfo.getExecutor().getClass(), retryerInfo.getMethod()); retryerInfo.getExecutor().getClass(), retryerInfo.getMethod());
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
SnailJobLog.REMOTE.error("参数解析异常", e); SnailJobLog.REMOTE.error("参数解析异常", e);
throw new SnailJobClientException("参数解析异常", e); throw new SnailRetryClientException("参数解析异常", e);
} }
DispatchRetryResultDTO executeRespDto = new DispatchRetryResultDTO(); DispatchRetryResultDTO executeRespDto = new DispatchRetryResultDTO();
@ -194,7 +183,7 @@ public class RetryEndPoint {
return new Result(0, "回调失败"); return new Result(0, "回调失败");
} }
RetryArgSerializer retryArgSerializer = SnailJobSpiLoader.loadRetryArgSerializer(); RetryArgSerializer retryArgSerializer = SnailRetrySpiLoader.loadRetryArgSerializer();
deSerialize = (Object[]) retryArgSerializer.deSerialize(callbackDTO.getArgsStr(), deSerialize = (Object[]) retryArgSerializer.deSerialize(callbackDTO.getArgsStr(),
retryerInfo.getExecutor().getClass(), retryerInfo.getMethod()); retryerInfo.getExecutor().getClass(), retryerInfo.getMethod());
@ -237,10 +226,10 @@ public class RetryEndPoint {
Object[].class); Object[].class);
break; break;
default: default:
throw new SnailJobClientException("回调状态异常"); throw new SnailRetryClientException("回调状态异常");
} }
Assert.notNull(method, () -> new SnailJobClientException("no such method")); Assert.notNull(method, () -> new SnailRetryClientException("no such method"));
ReflectionUtils.invokeMethod(method, retryCompleteCallback, retryerInfo.getScene(), ReflectionUtils.invokeMethod(method, retryCompleteCallback, retryerInfo.getScene(),
retryerInfo.getExecutorClassName(), deSerialize); retryerInfo.getExecutorClassName(), deSerialize);
return new Result(1, "回调成功"); return new Result(1, "回调成功");
@ -273,7 +262,7 @@ public class RetryEndPoint {
deSerialize); deSerialize);
break; break;
default: default:
throw new SnailJobClientException("回调状态异常"); throw new SnailRetryClientException("回调状态异常");
} }
return new Result(1, "回调成功"); return new Result(1, "回调成功");
@ -302,7 +291,7 @@ public class RetryEndPoint {
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, executorName); RetryerInfo retryerInfo = RetryerInfoCache.get(scene, executorName);
Assert.notNull(retryerInfo, Assert.notNull(retryerInfo,
() -> new SnailJobClientException("重试信息不存在 scene:[{}] executorName:[{}]", scene, executorName)); () -> new SnailRetryClientException("重试信息不存在 scene:[{}] executorName:[{}]", scene, executorName));
Method executorMethod = retryerInfo.getMethod(); Method executorMethod = retryerInfo.getMethod();
@ -313,7 +302,7 @@ public class RetryEndPoint {
deSerialize = (Object[]) retryArgSerializer.deSerialize(argsStr, retryerInfo.getExecutor().getClass(), deSerialize = (Object[]) retryArgSerializer.deSerialize(argsStr, retryerInfo.getExecutor().getClass(),
retryerInfo.getMethod()); retryerInfo.getMethod());
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
throw new SnailJobClientException("参数解析异常", e); throw new SnailRetryClientException("参数解析异常", e);
} }
String idempotentId; String idempotentId;
@ -326,7 +315,7 @@ public class RetryEndPoint {
idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, idempotentIdContext); idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, idempotentIdContext);
} catch (Exception exception) { } catch (Exception exception) {
SnailJobLog.LOCAL.error("幂等id生成异常{},{}", scene, argsStr, exception); SnailJobLog.LOCAL.error("幂等id生成异常{},{}", scene, argsStr, exception);
throw new SnailJobClientException("idempotentId生成异常{},{}", scene, argsStr); throw new SnailRetryClientException("idempotentId生成异常{},{}", scene, argsStr);
} }
return new Result<>(idempotentId); return new Result<>(idempotentId);

View File

@ -8,7 +8,7 @@ import lombok.extern.slf4j.Slf4j;
* @date : 2022-03-04 16:55 * @date : 2022-03-04 16:55
*/ */
@Slf4j @Slf4j
public class SimpleSnailJobListener implements SnailJobListener { public class SimpleSnailRetryListener implements SnailJobListener {
@Override @Override
public void beforeRetry(String sceneName, String executorClassName, Object[] params) { public void beforeRetry(String sceneName, String executorClassName, Object[] params) {

View File

@ -1,38 +0,0 @@
package com.aizuda.snailjob.client.core.exception;
import com.aizuda.snailjob.common.core.exception.BaseSnailJobException;
/**
* @author: opensnail
* @date : 2022-03-03 14:49
*/
public class SnailJobClientException extends BaseSnailJobException {
public SnailJobClientException(String message) {
super(message);
}
public SnailJobClientException(String message, Throwable cause) {
super(message, cause);
}
public SnailJobClientException(Throwable cause) {
super(cause);
}
public SnailJobClientException(String message, Object... arguments) {
super(message, arguments);
}
public SnailJobClientException(String message, Object[] arguments, Throwable cause) {
super(message, arguments, cause);
}
public SnailJobClientException(String message, Object argument, Throwable cause) {
super(message, argument, cause);
}
public SnailJobClientException(String message, Object argument) {
super(message, argument);
}
}

View File

@ -1,38 +0,0 @@
package com.aizuda.snailjob.client.core.exception;
import com.aizuda.snailjob.common.core.exception.BaseSnailJobException;
/**
* @author: opensnail
* @date : 2022-03-03 14:49
*/
public class SnailJobClientTimeOutException extends BaseSnailJobException {
public SnailJobClientTimeOutException(String message) {
super(message);
}
public SnailJobClientTimeOutException(String message, Throwable cause) {
super(message, cause);
}
public SnailJobClientTimeOutException(Throwable cause) {
super(cause);
}
public SnailJobClientTimeOutException(String message, Object... arguments) {
super(message, arguments);
}
public SnailJobClientTimeOutException(String message, Object[] arguments, Throwable cause) {
super(message, arguments, cause);
}
public SnailJobClientTimeOutException(String message, Object argument, Throwable cause) {
super(message, argument, cause);
}
public SnailJobClientTimeOutException(String message, Object argument) {
super(message, argument);
}
}

View File

@ -0,0 +1,38 @@
package com.aizuda.snailjob.client.core.exception;
import com.aizuda.snailjob.common.core.exception.BaseSnailJobException;
/**
* @author: opensnail
* @date : 2022-03-03 14:49
*/
public class SnailRetryClientException extends BaseSnailJobException {
public SnailRetryClientException(String message) {
super(message);
}
public SnailRetryClientException(String message, Throwable cause) {
super(message, cause);
}
public SnailRetryClientException(Throwable cause) {
super(cause);
}
public SnailRetryClientException(String message, Object... arguments) {
super(message, arguments);
}
public SnailRetryClientException(String message, Object[] arguments, Throwable cause) {
super(message, arguments, cause);
}
public SnailRetryClientException(String message, Object argument, Throwable cause) {
super(message, argument, cause);
}
public SnailRetryClientException(String message, Object argument) {
super(message, argument);
}
}

View File

@ -3,9 +3,8 @@ package com.aizuda.snailjob.client.core.executor;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.aizuda.snailjob.client.core.RetryExecutorParameter; import com.aizuda.snailjob.client.core.RetryExecutorParameter;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache; import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException;
import com.github.rholder.retry.RetryException; import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.RetryListener; import com.github.rholder.retry.RetryListener;
import com.github.rholder.retry.Retryer; import com.github.rholder.retry.Retryer;
@ -29,7 +28,7 @@ public class GuavaRetryExecutor extends AbstractRetryExecutor<WaitStrategy, Stop
public GuavaRetryExecutor(String sceneName, String executorClassName) { public GuavaRetryExecutor(String sceneName, String executorClassName) {
retryerInfo = RetryerInfoCache.get(sceneName, executorClassName); retryerInfo = RetryerInfoCache.get(sceneName, executorClassName);
Assert.notNull(retryerInfo, () -> new SnailJobClientException("retryerInfo is null sceneName:[{}] executorClassName:[{}]", sceneName, executorClassName)); Assert.notNull(retryerInfo, () -> new SnailRetryClientException("retryerInfo is null sceneName:[{}] executorClassName:[{}]", sceneName, executorClassName));
} }
public GuavaRetryExecutor() { public GuavaRetryExecutor() {

View File

@ -1,8 +1,8 @@
package com.aizuda.snailjob.client.core.intercepter; package com.aizuda.snailjob.client.core.intercepter;
import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext; import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.client.core.loader.SnailJobSpiLoader; import com.aizuda.snailjob.client.core.loader.SnailRetrySpiLoader;
import com.aizuda.snailjob.common.core.constant.SystemConstants; import com.aizuda.snailjob.common.core.constant.SystemConstants;
import com.aizuda.snailjob.common.core.model.SnailJobHeaders; import com.aizuda.snailjob.common.core.model.SnailJobHeaders;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -24,33 +24,33 @@ public class RetrySiteSnapshot {
/** /**
* 重试阶段1-内存重试阶段2-服务端重试阶段 * 重试阶段1-内存重试阶段2-服务端重试阶段
*/ */
private static final RetrySiteSnapshotContext<Integer> RETRY_STAGE = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<Integer> RETRY_STAGE = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 标记重试方法入口 * 标记重试方法入口
*/ */
private static final RetrySiteSnapshotContext<Deque<MethodEntranceMeta>> RETRY_CLASS_METHOD_ENTRANCE = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<Deque<MethodEntranceMeta>> RETRY_CLASS_METHOD_ENTRANCE = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 重试状态 * 重试状态
*/ */
private static final RetrySiteSnapshotContext<Integer> RETRY_STATUS = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<Integer> RETRY_STATUS = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 重试请求头 * 重试请求头
*/ */
private static final RetrySiteSnapshotContext<SnailJobHeaders> RETRY_HEADER = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<SnailJobHeaders> RETRY_HEADER = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 状态码 * 状态码
*/ */
private static final RetrySiteSnapshotContext<String> RETRY_STATUS_CODE = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<String> RETRY_STATUS_CODE = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 进入方法入口时间标记 * 进入方法入口时间标记
*/ */
private static final RetrySiteSnapshotContext<Long> ENTRY_METHOD_TIME = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<Long> ENTRY_METHOD_TIME = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
private static final RetrySiteSnapshotContext<Integer> ATTEMPT_NUMBER = SnailJobSpiLoader.loadRetrySiteSnapshotContext(); private static final RetrySiteSnapshotContext<Integer> ATTEMPT_NUMBER = SnailRetrySpiLoader.loadRetrySiteSnapshotContext();
public static Integer getAttemptNumber() { public static Integer getAttemptNumber() {
return ATTEMPT_NUMBER.get(); return ATTEMPT_NUMBER.get();
@ -256,7 +256,7 @@ public class RetrySiteSnapshot {
} }
} }
throw new SnailJobClientException("unsupported stage"); throw new SnailRetryClientException("unsupported stage");
} }
} }

View File

@ -1,6 +1,5 @@
package com.aizuda.snailjob.client.core.intercepter; package com.aizuda.snailjob.client.core.intercepter;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot.EnumStage;
import com.aizuda.snailjob.common.core.constant.SystemConstants; import com.aizuda.snailjob.common.core.constant.SystemConstants;
import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.common.core.model.SnailJobHeaders; import com.aizuda.snailjob.common.core.model.SnailJobHeaders;
@ -26,7 +25,7 @@ import java.util.Objects;
@Aspect @Aspect
@Component @Component
@Slf4j @Slf4j
public class HeaderAspect { public class SnailRetryHeaderAspect {
public void before() { public void before() {
if (skip()) { if (skip()) {
@ -86,7 +85,7 @@ public class HeaderAspect {
return; return;
} }
// 服务端重试的在com.aizuda.snailjob.client.core.client.RetryEndPoint.dispatch 中进行清除threadLocal // 服务端重试的在com.aizuda.snailjob.client.core.client.SnailRetryEndPoint.dispatch 中进行清除threadLocal
if (Objects.nonNull(RetrySiteSnapshot.getStage()) && RetrySiteSnapshot.EnumStage.REMOTE.getStage() == RetrySiteSnapshot.getStage()) { if (Objects.nonNull(RetrySiteSnapshot.getStage()) && RetrySiteSnapshot.EnumStage.REMOTE.getStage() == RetrySiteSnapshot.getStage()) {
return; return;
} }

View File

@ -7,7 +7,6 @@ import com.aizuda.snailjob.client.core.annotation.Propagation;
import com.aizuda.snailjob.client.core.annotation.Retryable; import com.aizuda.snailjob.client.core.annotation.Retryable;
import com.aizuda.snailjob.client.common.cache.GroupVersionCache; import com.aizuda.snailjob.client.common.cache.GroupVersionCache;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache; import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot.EnumStage;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext; import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
import com.aizuda.snailjob.client.core.strategy.RetryStrategy; import com.aizuda.snailjob.client.core.strategy.RetryStrategy;
@ -45,7 +44,7 @@ import java.util.UUID;
* @date 2023-08-23 * @date 2023-08-23
*/ */
@Slf4j @Slf4j
public class SnailJobInterceptor implements MethodInterceptor, AfterAdvice, Serializable, Ordered { public class SnailRetryInterceptor implements MethodInterceptor, AfterAdvice, Serializable, Ordered {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static String retryErrorMoreThresholdTextMessageFormatter = private static String retryErrorMoreThresholdTextMessageFormatter =
@ -59,7 +58,7 @@ public class SnailJobInterceptor implements MethodInterceptor, AfterAdvice, Seri
private final StandardEnvironment standardEnvironment; private final StandardEnvironment standardEnvironment;
private final RetryStrategy retryStrategy; private final RetryStrategy retryStrategy;
public SnailJobInterceptor(StandardEnvironment standardEnvironment, public SnailRetryInterceptor(StandardEnvironment standardEnvironment,
RetryStrategy localRetryStrategies) { RetryStrategy localRetryStrategies) {
this.standardEnvironment = standardEnvironment; this.standardEnvironment = standardEnvironment;
this.retryStrategy = localRetryStrategies; this.retryStrategy = localRetryStrategies;

View File

@ -29,13 +29,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
*/ */
//@Configuration //@Configuration
@Slf4j @Slf4j
public class SnailJobPointcutAdvisor extends AbstractPointcutAdvisor implements IntroductionAdvisor, BeanFactoryAware, InitializingBean { public class SnailRetryPointcutAdvisor extends AbstractPointcutAdvisor implements IntroductionAdvisor, BeanFactoryAware, InitializingBean {
private Advice advice; private Advice advice;
private Pointcut pointcut; private Pointcut pointcut;
private BeanFactory beanFactory; private BeanFactory beanFactory;
private MethodInterceptor snailJobInterceptor; private MethodInterceptor snailJobInterceptor;
public SnailJobPointcutAdvisor(MethodInterceptor methodInterceptor) { public SnailRetryPointcutAdvisor(MethodInterceptor methodInterceptor) {
this.snailJobInterceptor = methodInterceptor; this.snailJobInterceptor = methodInterceptor;
} }
@ -77,7 +77,7 @@ public class SnailJobPointcutAdvisor extends AbstractPointcutAdvisor implements
} }
protected Pointcut buildPointcut() { protected Pointcut buildPointcut() {
return new SnailJobAnnotationMethodPointcut(Retryable.class); return new SnailRetryAnnotationMethodPointcut(Retryable.class);
} }
@Override @Override
@ -85,13 +85,13 @@ public class SnailJobPointcutAdvisor extends AbstractPointcutAdvisor implements
return pointcut; return pointcut;
} }
private static final class SnailJobAnnotationMethodPointcut extends StaticMethodMatcherPointcut { private static final class SnailRetryAnnotationMethodPointcut extends StaticMethodMatcherPointcut {
private final MethodMatcher methodResolver; private final MethodMatcher methodResolver;
SnailJobAnnotationMethodPointcut(Class<? extends Annotation> annotationType) { SnailRetryAnnotationMethodPointcut(Class<? extends Annotation> annotationType) {
this.methodResolver = new AnnotationMethodMatcher(annotationType, true); this.methodResolver = new AnnotationMethodMatcher(annotationType, true);
setClassFilter(new SnailJobAnnotationClassOrMethodFilter(annotationType)); setClassFilter(new SnailRetryAnnotationClassOrMethodFilter(annotationType));
} }
@Override @Override
@ -104,20 +104,20 @@ public class SnailJobPointcutAdvisor extends AbstractPointcutAdvisor implements
if (this == other) { if (this == other) {
return true; return true;
} }
if (!(other instanceof SnailJobAnnotationMethodPointcut)) { if (!(other instanceof SnailRetryAnnotationMethodPointcut)) {
return false; return false;
} }
SnailJobAnnotationMethodPointcut otherAdvisor = (SnailJobAnnotationMethodPointcut) other; SnailRetryAnnotationMethodPointcut otherAdvisor = (SnailRetryAnnotationMethodPointcut) other;
return ObjectUtils.nullSafeEquals(this.methodResolver, otherAdvisor.methodResolver); return ObjectUtils.nullSafeEquals(this.methodResolver, otherAdvisor.methodResolver);
} }
} }
private static final class SnailJobAnnotationClassOrMethodFilter extends AnnotationClassFilter { private static final class SnailRetryAnnotationClassOrMethodFilter extends AnnotationClassFilter {
private final AnnotationMethodsResolver methodResolver; private final AnnotationMethodsResolver methodResolver;
SnailJobAnnotationClassOrMethodFilter(Class<? extends Annotation> annotationType) { SnailRetryAnnotationClassOrMethodFilter(Class<? extends Annotation> annotationType) {
super(annotationType, true); super(annotationType, true);
this.methodResolver = new AnnotationMethodsResolver(annotationType); this.methodResolver = new AnnotationMethodsResolver(annotationType);
} }

View File

@ -2,7 +2,7 @@ package com.aizuda.snailjob.client.core.intercepter;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext; import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
/** /**
* ThreadLocal实现类 * ThreadLocal实现类
@ -16,7 +16,7 @@ public class ThreadLockRetrySiteSnapshotContext<T> implements RetrySiteSnapshotC
private final ThreadLocal<T> threadLocal; private final ThreadLocal<T> threadLocal;
public ThreadLockRetrySiteSnapshotContext(ThreadLocal<T> threadLocal) { public ThreadLockRetrySiteSnapshotContext(ThreadLocal<T> threadLocal) {
Assert.notNull(threadLocal, ()-> new SnailJobClientException("thread local can not be null")); Assert.notNull(threadLocal, ()-> new SnailRetryClientException("thread local can not be null"));
this.threadLocal = threadLocal; this.threadLocal = threadLocal;
} }

View File

@ -5,17 +5,12 @@ import com.aizuda.snailjob.client.core.expression.ExpressionInvocationHandler;
import com.aizuda.snailjob.common.core.expression.ExpressionEngine; import com.aizuda.snailjob.common.core.expression.ExpressionEngine;
import com.aizuda.snailjob.client.core.RetryArgSerializer; import com.aizuda.snailjob.client.core.RetryArgSerializer;
import com.aizuda.snailjob.client.core.event.SnailJobListener; import com.aizuda.snailjob.client.core.event.SnailJobListener;
import com.aizuda.snailjob.client.core.event.SimpleSnailJobListener; import com.aizuda.snailjob.client.core.event.SimpleSnailRetryListener;
import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext; import com.aizuda.snailjob.client.core.RetrySiteSnapshotContext;
import com.aizuda.snailjob.common.core.expression.ExpressionFactory; import com.aizuda.snailjob.common.core.expression.ExpressionFactory;
import com.aizuda.snailjob.common.core.expression.strategy.SpELExpressionEngine; import com.aizuda.snailjob.common.core.expression.strategy.SpELExpressionEngine;
import com.aizuda.snailjob.client.core.intercepter.ThreadLockRetrySiteSnapshotContext; import com.aizuda.snailjob.client.core.intercepter.ThreadLockRetrySiteSnapshotContext;
import com.aizuda.snailjob.client.core.serializer.JacksonSerializer; import com.aizuda.snailjob.client.core.serializer.JacksonSerializer;
import com.aizuda.snailjob.client.core.event.SimpleSnailJobListener;
import com.aizuda.snailjob.client.core.event.SnailJobListener;
import com.aizuda.snailjob.client.core.expression.ExpressionInvocationHandler;
import com.aizuda.snailjob.client.core.intercepter.ThreadLockRetrySiteSnapshotContext;
import com.aizuda.snailjob.client.core.serializer.JacksonSerializer;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.Collections; import java.util.Collections;
@ -29,9 +24,9 @@ import java.util.Optional;
* @date : 2023-08-07 18:05 * @date : 2023-08-07 18:05
* @since 2.2.0 * @since 2.2.0
*/ */
public class SnailJobSpiLoader { public class SnailRetrySpiLoader {
private SnailJobSpiLoader() {} private SnailRetrySpiLoader() {}
/** /**
* 加载参数序列化SPI类 * 加载参数序列化SPI类
@ -47,12 +42,12 @@ public class SnailJobSpiLoader {
* 加载重试监听器SPI类 * 加载重试监听器SPI类
* 执行顺序按照文件中定义的实现类的先后顺序 * 执行顺序按照文件中定义的实现类的先后顺序
* *
* @return {@link SimpleSnailJobListener} 默认序列化类为SimpleSnailJobListener * @return {@link SimpleSnailRetryListener} 默认序列化类为SimpleSnailJobListener
*/ */
public static List<SnailJobListener> loadSnailJobListener() { public static List<SnailJobListener> loadSnailJobListener() {
List<SnailJobListener> snailJobListeners = ServiceLoaderUtil.loadList(SnailJobListener.class); List<SnailJobListener> snailJobListeners = ServiceLoaderUtil.loadList(SnailJobListener.class);
if (CollectionUtils.isEmpty(snailJobListeners)) { if (CollectionUtils.isEmpty(snailJobListeners)) {
return Collections.singletonList(new SimpleSnailJobListener()); return Collections.singletonList(new SimpleSnailRetryListener());
} }
return snailJobListeners; return snailJobListeners;

View File

@ -1,13 +1,11 @@
package com.aizuda.snailjob.client.core.plugin; package com.aizuda.snailjob.client.core.plugin;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.common.core.constant.SystemConstants; import com.aizuda.snailjob.common.core.constant.SystemConstants;
import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.common.core.model.SnailJobHeaders; import com.aizuda.snailjob.common.core.model.SnailJobHeaders;
import com.aizuda.snailjob.common.core.util.JsonUtil; import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.HashMap; import java.util.HashMap;
@ -48,7 +46,7 @@ public class RequestHeaderPlugins {
// 重新刷新进入时间 // 重新刷新进入时间
RetrySiteSnapshot.setEntryMethodTime(System.currentTimeMillis()); RetrySiteSnapshot.setEntryMethodTime(System.currentTimeMillis());
} else { } else {
throw new SnailJobClientException("调用链超时, 不在继续调用后面请求"); throw new SnailRetryClientException("调用链超时, 不在继续调用后面请求");
} }
} }

View File

@ -3,9 +3,7 @@ package com.aizuda.snailjob.client.core.register;
import com.aizuda.snailjob.client.common.Lifecycle; import com.aizuda.snailjob.client.common.Lifecycle;
import com.aizuda.snailjob.client.core.Scanner; import com.aizuda.snailjob.client.core.Scanner;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache; import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -26,7 +24,7 @@ public class RetryableRegistrar implements Lifecycle {
public void registerRetryHandler(RetryerInfo retryerInfo) { public void registerRetryHandler(RetryerInfo retryerInfo) {
if (Objects.nonNull(RetryerInfoCache.get(retryerInfo.getScene(), retryerInfo.getExecutorClassName()))) { if (Objects.nonNull(RetryerInfoCache.get(retryerInfo.getScene(), retryerInfo.getExecutorClassName()))) {
throw new SnailJobClientException("类:[{}]中已经存在场景:[{}]", retryerInfo.getExecutorClassName(), retryerInfo.getScene()); throw new SnailRetryClientException("类:[{}]中已经存在场景:[{}]", retryerInfo.getExecutorClassName(), retryerInfo.getScene());
} }
RetryerInfoCache.put(retryerInfo); RetryerInfoCache.put(retryerInfo);

View File

@ -3,19 +3,17 @@ package com.aizuda.snailjob.client.core.report;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import com.aizuda.snailjob.client.core.Report; import com.aizuda.snailjob.client.core.Report;
import com.aizuda.snailjob.client.common.config.SnailJobProperties; import com.aizuda.snailjob.client.common.config.SnailJobProperties;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.common.core.expression.ExpressionEngine; import com.aizuda.snailjob.common.core.expression.ExpressionEngine;
import com.aizuda.snailjob.client.core.IdempotentIdGenerate; import com.aizuda.snailjob.client.core.IdempotentIdGenerate;
import com.aizuda.snailjob.client.core.RetryArgSerializer; import com.aizuda.snailjob.client.core.RetryArgSerializer;
import com.aizuda.snailjob.client.core.cache.RetryerInfoCache; import com.aizuda.snailjob.client.core.cache.RetryerInfoCache;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.loader.SnailJobSpiLoader; import com.aizuda.snailjob.client.core.loader.SnailRetrySpiLoader;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.common.core.model.IdempotentIdContext; import com.aizuda.snailjob.common.core.model.IdempotentIdContext;
import com.aizuda.snailjob.server.model.dto.RetryTaskDTO; import com.aizuda.snailjob.server.model.dto.RetryTaskDTO;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
@ -34,7 +32,7 @@ public abstract class AbstractReport implements Report {
@Override @Override
public boolean report(String scene, final String targetClassName, final Object[] params) { public boolean report(String scene, final String targetClassName, final Object[] params) {
RetryerInfo retryerInfo = RetryerInfoCache.get(scene, targetClassName); RetryerInfo retryerInfo = RetryerInfoCache.get(scene, targetClassName);
Assert.notNull(retryerInfo, () -> new SnailJobClientException("retryerInfo is null")); Assert.notNull(retryerInfo, () -> new SnailRetryClientException("retryerInfo is null"));
if (RetrySiteSnapshot.getStage().equals(RetrySiteSnapshot.EnumStage.REMOTE.getStage()) && !retryerInfo.isForceReport()) { if (RetrySiteSnapshot.getStage().equals(RetrySiteSnapshot.EnumStage.REMOTE.getStage()) && !retryerInfo.isForceReport()) {
SnailJobLog.LOCAL.info("Successfully reported, no need to repeat reporting. scene:[{}] targetClassName:[{}] args:[{}]", SnailJobLog.LOCAL.info("Successfully reported, no need to repeat reporting. scene:[{}] targetClassName:[{}] args:[{}]",
@ -69,10 +67,10 @@ public abstract class AbstractReport implements Report {
idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, idempotentIdContext); idempotentId = (String) ReflectionUtils.invokeMethod(method, generate, idempotentIdContext);
} catch (Exception exception) { } catch (Exception exception) {
SnailJobLog.LOCAL.error("幂等id生成异常{},{}", scene, args, exception); SnailJobLog.LOCAL.error("幂等id生成异常{},{}", scene, args, exception);
throw new SnailJobClientException("idempotentId生成异常{},{}", scene, args); throw new SnailRetryClientException("idempotentId生成异常{},{}", scene, args);
} }
RetryArgSerializer retryArgSerializer = SnailJobSpiLoader.loadRetryArgSerializer(); RetryArgSerializer retryArgSerializer = SnailRetrySpiLoader.loadRetryArgSerializer();
String serialize = retryArgSerializer.serialize(args); String serialize = retryArgSerializer.serialize(args);
retryTaskDTO.setIdempotentId(idempotentId); retryTaskDTO.setIdempotentId(idempotentId);
@ -82,7 +80,7 @@ public abstract class AbstractReport implements Report {
retryTaskDTO.setSceneName(scene); retryTaskDTO.setSceneName(scene);
String expression = retryerInfo.getBizNo(); String expression = retryerInfo.getBizNo();
ExpressionEngine expressionEngine = SnailJobSpiLoader.loadExpressionEngine(); ExpressionEngine expressionEngine = SnailRetrySpiLoader.loadExpressionEngine();
retryTaskDTO.setBizNo((String) expressionEngine.eval(expression, args, executorMethod)); retryTaskDTO.setBizNo((String) expressionEngine.eval(expression, args, executorMethod));
return retryTaskDTO; return retryTaskDTO;
} }

View File

@ -8,8 +8,7 @@ import com.aizuda.snailjob.client.core.RetryExecutorParameter;
import com.aizuda.snailjob.client.core.event.SnailJobListener; import com.aizuda.snailjob.client.core.event.SnailJobListener;
import com.aizuda.snailjob.client.core.executor.GuavaRetryExecutor; import com.aizuda.snailjob.client.core.executor.GuavaRetryExecutor;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot.EnumStatus; import com.aizuda.snailjob.client.core.loader.SnailRetrySpiLoader;
import com.aizuda.snailjob.client.core.loader.SnailJobSpiLoader;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext; import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
import com.aizuda.snailjob.common.core.alarm.Alarm; import com.aizuda.snailjob.common.core.alarm.Alarm;
@ -20,10 +19,6 @@ import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.common.core.util.EnvironmentUtils; import com.aizuda.snailjob.common.core.util.EnvironmentUtils;
import com.aizuda.snailjob.common.core.util.NetUtil; import com.aizuda.snailjob.common.core.util.NetUtil;
import com.aizuda.snailjob.server.model.dto.ConfigDTO; import com.aizuda.snailjob.server.model.dto.ConfigDTO;
import com.aizuda.snailjob.client.core.executor.GuavaRetryExecutor;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
import com.github.rholder.retry.Retryer; import com.github.rholder.retry.Retryer;
import com.github.rholder.retry.StopStrategy; import com.github.rholder.retry.StopStrategy;
import com.github.rholder.retry.WaitStrategy; import com.github.rholder.retry.WaitStrategy;
@ -53,7 +48,7 @@ public abstract class AbstractRetryStrategies implements RetryStrategy {
"> 异常:{} \n" "> 异常:{} \n"
; ;
private final List<SnailJobListener> snailJobListeners = SnailJobSpiLoader.loadSnailJobListener(); private final List<SnailJobListener> snailJobListeners = SnailRetrySpiLoader.loadSnailJobListener();
@Autowired @Autowired
private SnailJobAlarmFactory snailJobAlarmFactory; private SnailJobAlarmFactory snailJobAlarmFactory;

View File

@ -2,14 +2,13 @@ package com.aizuda.snailjob.client.core.strategy;
import com.aizuda.snailjob.client.core.RetryExecutor; import com.aizuda.snailjob.client.core.RetryExecutor;
import com.aizuda.snailjob.client.core.RetryExecutorParameter; import com.aizuda.snailjob.client.core.RetryExecutorParameter;
import com.aizuda.snailjob.client.core.exception.SnailJobClientException; import com.aizuda.snailjob.client.core.exception.SnailRetryClientException;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.snailjob.client.core.retryer.RetryType; import com.aizuda.snailjob.client.core.retryer.RetryType;
import com.aizuda.snailjob.client.core.retryer.RetryerInfo; import com.aizuda.snailjob.client.core.retryer.RetryerInfo;
import com.aizuda.snailjob.client.core.retryer.RetryerResultContext; import com.aizuda.snailjob.client.core.retryer.RetryerResultContext;
import com.aizuda.snailjob.common.core.enums.RetryResultStatusEnum; import com.aizuda.snailjob.common.core.enums.RetryResultStatusEnum;
import com.aizuda.snailjob.common.log.SnailJobLog; import com.aizuda.snailjob.common.log.SnailJobLog;
import com.aizuda.snailjob.client.core.intercepter.RetrySiteSnapshot;
import com.github.rholder.retry.Attempt; import com.github.rholder.retry.Attempt;
import com.github.rholder.retry.RetryListener; import com.github.rholder.retry.RetryListener;
import com.github.rholder.retry.StopStrategies; import com.github.rholder.retry.StopStrategies;
@ -128,7 +127,7 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
RetrySiteSnapshot.setStage(RetrySiteSnapshot.EnumStage.REMOTE.getStage()); RetrySiteSnapshot.setStage(RetrySiteSnapshot.EnumStage.REMOTE.getStage());
return () -> null; return () -> null;
default: default:
throw new SnailJobClientException("异常重试模式 [{}]", retryType.name()); throw new SnailRetryClientException("异常重试模式 [{}]", retryType.name());
} }
} }
@ -164,7 +163,7 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
SnailJobLog.LOCAL.error("[{}] 上报服务端执行失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber()); SnailJobLog.LOCAL.error("[{}] 上报服务端执行失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber());
break; break;
default: default:
throw new SnailJobClientException("异常重试模式 [{}]", retryType.name()); throw new SnailRetryClientException("异常重试模式 [{}]", retryType.name());
} }
} else { } else {
@ -178,7 +177,7 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
SnailJobLog.LOCAL.info("[{}] 上报服务端执行成功.", retryerInfo.getScene()); SnailJobLog.LOCAL.info("[{}] 上报服务端执行成功.", retryerInfo.getScene());
break; break;
default: default:
throw new SnailJobClientException("异常重试模式 [{}]", retryType.name()); throw new SnailRetryClientException("异常重试模式 [{}]", retryType.name());
} }
} }