feat: 2.2.0

1. 优化数据处理模板
2. 优化客户端日志
This commit is contained in:
byteblogs168 2023-08-28 16:56:02 +08:00
parent 68f9e77a92
commit 1ad33bff6c
6 changed files with 39 additions and 58 deletions

View File

@ -9,6 +9,7 @@ import com.aizuda.easy.retry.common.core.model.EasyRetryHeaders;
import lombok.Getter; import lombok.Getter;
import java.util.Objects; import java.util.Objects;
import java.util.Optional;
/** /**
* 重试现场记录器 * 重试现场记录器
@ -31,7 +32,7 @@ public class RetrySiteSnapshot {
/** /**
* 重试状态 * 重试状态
*/ */
private static final RetrySiteSnapshotContext<Integer> RETRY_STATUS = EasyRetrySpiLoader.loadRetrySiteSnapshotContext(new ThreadLockRetrySiteSnapshotContext<>(ThreadLocal.withInitial(EnumStatus.COMPLETE::getStatus))); private static final RetrySiteSnapshotContext<Integer> RETRY_STATUS = EasyRetrySpiLoader.loadRetrySiteSnapshotContext();
/** /**
* 重试请求头 * 重试请求头
@ -77,7 +78,8 @@ public class RetrySiteSnapshot {
} }
public static Integer getStatus() { public static Integer getStatus() {
return RETRY_STATUS.get(); return Optional.ofNullable(RETRY_STATUS.get()).orElse(EnumStatus.COMPLETE.status);
} }
public static void setStatus(Integer status) { public static void setStatus(Integer status) {

View File

@ -52,16 +52,7 @@ public class EasyRetrySpiLoader {
/** /**
* 加载重试现场记录上下文SPI类 * 加载重试现场记录上下文SPI类
* *
* @return {@link SimpleEasyRetryListener} 默认序列化类为SimpleEasyRetryListener * @return {@link RetrySiteSnapshotContext} 默认序列化类为ThreadLockRetrySiteSnapshotContext
*/
public static <T> RetrySiteSnapshotContext<T> loadRetrySiteSnapshotContext(RetrySiteSnapshotContext<T> context) {
return Optional.ofNullable(ServiceLoaderUtil.loadFirst(RetrySiteSnapshotContext.class)).orElse(context);
}
/**
* 加载重试现场记录上下文SPI类
*
* @return {@link SimpleEasyRetryListener} 默认序列化类为SimpleEasyRetryListener
*/ */
public static <T> RetrySiteSnapshotContext<T> loadRetrySiteSnapshotContext() { public static <T> RetrySiteSnapshotContext<T> loadRetrySiteSnapshotContext() {
return Optional.ofNullable(ServiceLoaderUtil.loadFirst(RetrySiteSnapshotContext.class)).orElse(new ThreadLockRetrySiteSnapshotContext<T>(new ThreadLocal<>())); return Optional.ofNullable(ServiceLoaderUtil.loadFirst(RetrySiteSnapshotContext.class)).orElse(new ThreadLockRetrySiteSnapshotContext<T>(new ThreadLocal<>()));

View File

@ -7,6 +7,7 @@ import com.aizuda.easy.retry.client.core.config.EasyRetryProperties;
import com.aizuda.easy.retry.client.core.event.EasyRetryListener; import com.aizuda.easy.retry.client.core.event.EasyRetryListener;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot; import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot;
import com.aizuda.easy.retry.client.core.Report; import com.aizuda.easy.retry.client.core.Report;
import com.aizuda.easy.retry.client.core.intercepter.RetrySiteSnapshot.EnumStatus;
import com.aizuda.easy.retry.client.core.loader.EasyRetrySpiLoader; import com.aizuda.easy.retry.client.core.loader.EasyRetrySpiLoader;
import com.aizuda.easy.retry.common.core.alarm.Alarm; import com.aizuda.easy.retry.common.core.alarm.Alarm;
import com.aizuda.easy.retry.common.core.alarm.AlarmContext; import com.aizuda.easy.retry.common.core.alarm.AlarmContext;
@ -90,6 +91,9 @@ public abstract class AbstractRetryStrategies implements RetryStrategy {
// 预警 // 预警
sendMessage(e); sendMessage(e);
} finally {
// 重试调度完成
RetrySiteSnapshot.setStatus(EnumStatus.COMPLETE.getStatus());
} }
return retryerResultContext; return retryerResultContext;
@ -132,8 +136,6 @@ public abstract class AbstractRetryStrategies implements RetryStrategy {
} catch (Exception e) { } catch (Exception e) {
log.error("失败监听者模式 处理失败 ", e); log.error("失败监听者模式 处理失败 ", e);
throw e; throw e;
} finally {
RetrySiteSnapshot.setStatus(RetrySiteSnapshot.EnumStatus.COMPLETE.getStatus());
} }
doGetRetryErrorConsumer(retryerInfo, params).accept(throwable); doGetRetryErrorConsumer(retryerInfo, params).accept(throwable);

View File

@ -162,10 +162,10 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
switch (retryType) { switch (retryType) {
case ONLY_LOCAL: case ONLY_LOCAL:
case LOCAL_REMOTE: case LOCAL_REMOTE:
LogUtils.error(log,"[{}] 执行本地重试失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber()); LogUtils.error(log,"[{}] 本地重试执行失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber());
break; break;
case ONLY_REMOTE: case ONLY_REMOTE:
LogUtils.error(log,"[{}] 执行上报服务端失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber()); LogUtils.error(log,"[{}] 上报服务端执行失败,第[{}]次重试", retryerInfo.getScene(), attempt.getAttemptNumber());
break; break;
default: default:
throw new EasyRetryClientException("异常重试模式 [{}]", retryType.name()); throw new EasyRetryClientException("异常重试模式 [{}]", retryType.name());
@ -176,10 +176,10 @@ public class LocalRetryStrategies extends AbstractRetryStrategies {
switch (retryType) { switch (retryType) {
case ONLY_LOCAL: case ONLY_LOCAL:
case LOCAL_REMOTE: case LOCAL_REMOTE:
LogUtils.info(log,"[{}] 执行本地重试成功.", retryerInfo.getScene()); LogUtils.info(log,"[{}] 本地重试执行成功.", retryerInfo.getScene());
break; break;
case ONLY_REMOTE: case ONLY_REMOTE:
LogUtils.info(log,"[{}] 执行上报服务端成功.", retryerInfo.getScene()); LogUtils.info(log,"[{}] 上报服务端执行成功.", retryerInfo.getScene());
break; break;
default: default:
throw new EasyRetryClientException("异常重试模式 [{}]", retryType.name()); throw new EasyRetryClientException("异常重试模式 [{}]", retryType.name());

View File

@ -8,10 +8,12 @@ import com.aizuda.easy.retry.template.datasource.access.task.RetryTaskAccess;
import com.aizuda.easy.retry.template.datasource.enums.OperationTypeEnum; import com.aizuda.easy.retry.template.datasource.enums.OperationTypeEnum;
import com.aizuda.easy.retry.template.datasource.exception.EasyRetryDatasourceException; import com.aizuda.easy.retry.template.datasource.exception.EasyRetryDatasourceException;
import com.aizuda.easy.retry.template.datasource.persistence.po.*; import com.aizuda.easy.retry.template.datasource.persistence.po.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional;
/** /**
* 数据处理模板类 * 数据处理模板类
@ -22,9 +24,18 @@ import java.util.List;
*/ */
@Component @Component
public class AccessTemplate { public class AccessTemplate {
protected Map<String, Access> REGISTER_ACCESS = new HashMap<>();
public AccessTemplate(List<Access> accesses) {
@Autowired for (Access access : accesses) {
private List<Access> accesses; for (final OperationTypeEnum typeEnum : OperationTypeEnum.values()) {
if (access.supports(typeEnum.name())) {
REGISTER_ACCESS.put(typeEnum.name(), access);
break;
}
}
}
}
/** /**
* 获取重试任务操作类 * 获取重试任务操作类
@ -32,14 +43,8 @@ public class AccessTemplate {
* @return {@link RetryTaskAccess} 重试任务操作类 * @return {@link RetryTaskAccess} 重试任务操作类
*/ */
public TaskAccess<RetryTask> getRetryTaskAccess() { public TaskAccess<RetryTask> getRetryTaskAccess() {
return (TaskAccess<RetryTask>) Optional.ofNullable(REGISTER_ACCESS.get(OperationTypeEnum.RETRY_TASK.name()))
for (Access access : accesses) { .orElseThrow(() -> new EasyRetryDatasourceException("not supports operation type"));
if (access.supports(OperationTypeEnum.RETRY_TASK.name())) {
return (TaskAccess<RetryTask>) access;
}
}
throw new EasyRetryDatasourceException("not supports operation type");
} }
/** /**
@ -48,14 +53,10 @@ public class AccessTemplate {
* @return {@link RetryDeadLetterTaskAccess} 获取死信任务操作类 * @return {@link RetryDeadLetterTaskAccess} 获取死信任务操作类
*/ */
public TaskAccess<RetryDeadLetter> getRetryDeadLetterAccess() { public TaskAccess<RetryDeadLetter> getRetryDeadLetterAccess() {
return (TaskAccess<RetryDeadLetter>) Optional.ofNullable(
REGISTER_ACCESS.get(OperationTypeEnum.RETRY_DEAD_LETTER.name()))
.orElseThrow(() -> new EasyRetryDatasourceException("not supports operation type"));
for (Access access : accesses) {
if (access.supports(OperationTypeEnum.RETRY_DEAD_LETTER.name())) {
return (TaskAccess<RetryDeadLetter>) access;
}
}
throw new EasyRetryDatasourceException("not supports operation type");
} }
/** /**
@ -64,14 +65,9 @@ public class AccessTemplate {
* @return {@link SceneConfigAccess} 获取场景配置操作类 * @return {@link SceneConfigAccess} 获取场景配置操作类
*/ */
public ConfigAccess<SceneConfig> getSceneConfigAccess() { public ConfigAccess<SceneConfig> getSceneConfigAccess() {
return (ConfigAccess<SceneConfig>) Optional.ofNullable(REGISTER_ACCESS.get(OperationTypeEnum.SCENE.name()))
.orElseThrow(() -> new EasyRetryDatasourceException("not supports operation type"));
for (Access access : accesses) {
if (access.supports(OperationTypeEnum.SCENE.name())) {
return (ConfigAccess<SceneConfig>) access;
}
}
throw new EasyRetryDatasourceException("not supports operation type");
} }
/** /**
@ -80,14 +76,9 @@ public class AccessTemplate {
* @return {@link GroupConfigAccess} 获取组配置操作类 * @return {@link GroupConfigAccess} 获取组配置操作类
*/ */
public ConfigAccess<GroupConfig> getGroupConfigAccess() { public ConfigAccess<GroupConfig> getGroupConfigAccess() {
return (ConfigAccess<GroupConfig>) Optional.ofNullable(REGISTER_ACCESS.get(OperationTypeEnum.GROUP.name()))
.orElseThrow(() -> new EasyRetryDatasourceException("not supports operation type"));
for (Access access : accesses) {
if (access.supports(OperationTypeEnum.GROUP.name())) {
return (ConfigAccess<GroupConfig>) access;
}
}
throw new EasyRetryDatasourceException("not supports operation type");
} }
/** /**
@ -96,14 +87,9 @@ public class AccessTemplate {
* @return {@link NotifyConfigAccess} 获取通知配置操作类 * @return {@link NotifyConfigAccess} 获取通知配置操作类
*/ */
public ConfigAccess<NotifyConfig> getNotifyConfigAccess() { public ConfigAccess<NotifyConfig> getNotifyConfigAccess() {
return (ConfigAccess<NotifyConfig>) Optional.ofNullable(REGISTER_ACCESS.get(OperationTypeEnum.NOTIFY.name()))
.orElseThrow(() -> new EasyRetryDatasourceException("not supports operation type"));
for (Access access : accesses) {
if (access.supports(OperationTypeEnum.GROUP.name())) {
return (ConfigAccess<NotifyConfig>) access;
}
}
throw new EasyRetryDatasourceException("not supports operation type");
} }
} }

View File

@ -36,7 +36,7 @@ public abstract class AbstractConfigAccess<T> implements ConfigAccess<T> {
protected GroupConfigMapper groupConfigMapper; protected GroupConfigMapper groupConfigMapper;
@Autowired @Autowired
protected Environment environment; protected Environment environment;
protected static final List<String> ALLOW_DB = Arrays.asList(DbTypeEnum.MYSQL.getDb(), protected static final List<String> ALLOW_DB = Arrays.asList(DbTypeEnum.MYSQL.getDb(),
DbTypeEnum.MARIADB.getDb(), DbTypeEnum.MARIADB.getDb(),
DbTypeEnum.POSTGRES.getDb()); DbTypeEnum.POSTGRES.getDb());