feat: 1.4.0

1. 支持初始化场景配置
This commit is contained in:
byteblogs168 2023-05-31 10:16:29 +08:00
parent 9333288e7e
commit 1d0e792eb0
12 changed files with 83 additions and 10 deletions

View File

@ -8,6 +8,7 @@ CREATE TABLE `group_config`
`group_partition` int(11) NOT NULL COMMENT '分区',
`route_key` tinyint(4) NOT NULL COMMENT '路由策略',
`id_generator_mode` tinyint(4) NOT NULL DEFAULT '1' COMMENT '唯一id生成模式 默认号段模式',
`init_scene` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否初始化场景 0:否 1:是',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),

View File

@ -123,5 +123,6 @@ public @interface Retryable {
*/
TimeUnit unit() default TimeUnit.MILLISECONDS;
}

View File

@ -77,7 +77,8 @@ public enum DelayLevelEnum {
}
}
throw new EasyRetryCommonException("level:[{}] 不存在", level);
// 若配置的不存在默认1个小时一次
return DelayLevelEnum._15;
}
}

View File

@ -25,6 +25,8 @@ public class GroupConfig implements Serializable {
private Integer version;
private Integer initScene;
private String description;
private LocalDateTime createDt;

View File

@ -1,11 +1,13 @@
package com.aizuda.easy.retry.server.service.impl;
import cn.hutool.core.lang.Assert;
import com.aizuda.easy.retry.common.core.enums.StatusEnum;
import com.aizuda.easy.retry.common.core.log.LogUtils;
import com.aizuda.easy.retry.server.exception.EasyRetryServerException;
import com.aizuda.easy.retry.server.model.dto.RetryTaskDTO;
import com.aizuda.easy.retry.server.persistence.mybatis.mapper.RetryDeadLetterMapper;
import com.aizuda.easy.retry.server.persistence.mybatis.mapper.RetryTaskMapper;
import com.aizuda.easy.retry.server.persistence.mybatis.mapper.SceneConfigMapper;
import com.aizuda.easy.retry.server.persistence.mybatis.po.GroupConfig;
import com.aizuda.easy.retry.server.persistence.mybatis.po.RetryDeadLetter;
import com.aizuda.easy.retry.server.persistence.mybatis.po.RetryTask;
@ -14,6 +16,7 @@ import com.aizuda.easy.retry.server.persistence.support.ConfigAccess;
import com.aizuda.easy.retry.server.persistence.support.RetryTaskAccess;
import com.aizuda.easy.retry.server.support.generator.IdGenerator;
import com.aizuda.easy.retry.server.support.strategy.WaitStrategies;
import com.aizuda.easy.retry.server.support.strategy.WaitStrategies.WaitStrategyEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.aizuda.easy.retry.common.core.enums.RetryStatusEnum;
import com.aizuda.easy.retry.server.config.RequestDataHelper;
@ -49,18 +52,18 @@ public class RetryServiceImpl implements RetryService {
@Autowired
@Qualifier("retryTaskAccessProcessor")
private RetryTaskAccess<RetryTask> retryTaskAccess;
@Autowired
@Qualifier("configAccessProcessor")
private ConfigAccess configAccess;
@Autowired
private List<IdGenerator> idGeneratorList;
@Autowired
private RetryTaskMapper retryTaskMapper;
@Autowired
private RetryDeadLetterMapper retryDeadLetterMapper;
@Autowired
private SceneConfigMapper sceneConfigMapper;
@Transactional
@Override
@ -69,7 +72,18 @@ public class RetryServiceImpl implements RetryService {
SceneConfig sceneConfig = configAccess.getSceneConfigByGroupNameAndSceneName(retryTaskDTO.getGroupName(), retryTaskDTO.getSceneName());
if (Objects.isNull(sceneConfig)) {
GroupConfig groupConfig = configAccess.getGroupConfigByGroupName(retryTaskDTO.getGroupName());
if (Objects.isNull(groupConfig)) {
throw new EasyRetryServerException("failed to report data, no group configuration found. groupName:[{}]", retryTaskDTO.getGroupName());
}
if (groupConfig.getInitScene().equals(StatusEnum.NO.getStatus())) {
throw new EasyRetryServerException("failed to report data, no scene configuration found. groupName:[{}] sceneName:[{}]", retryTaskDTO.getGroupName(), retryTaskDTO.getSceneName());
} else {
// 若配置了默认初始化场景配置则发现上报数据的时候未配置场景默认生成一个场景
initScene(retryTaskDTO);
}
}
RequestDataHelper.setPartition(retryTaskDTO.getGroupName());
@ -100,6 +114,26 @@ public class RetryServiceImpl implements RetryService {
return Boolean.TRUE;
}
/**
* 若配置了默认初始化场景配置则发现上报数据的时候未配置场景默认生成一个场景
* backOff(退避策略): 等级策略
* maxRetryCount(最大重试次数): 26
* triggerInterval(间隔时间): see: {@link com.aizuda.easy.retry.common.core.enums.DelayLevelEnum}
*
* @param retryTaskDTO 重试上报DTO
*/
private void initScene(final RetryTaskDTO retryTaskDTO) {
SceneConfig sceneConfig;
sceneConfig = new SceneConfig();
sceneConfig.setGroupName(retryTaskDTO.getGroupName());
sceneConfig.setSceneName(retryTaskDTO.getSceneName());
sceneConfig.setSceneStatus(StatusEnum.YES.getStatus());
sceneConfig.setBackOff(WaitStrategyEnum.DELAY_LEVEL.getBackOff());
sceneConfig.setMaxRetryCount(26);
sceneConfig.setDescription("注解配置开启默认初始化场景");
Assert.isTrue(1 == sceneConfigMapper.insert(sceneConfig), () -> new EasyRetryServerException("init scene error"));
}
@Transactional
@Override
public Boolean batchReportRetry(List<RetryTaskDTO> retryTaskDTOList) {

View File

@ -12,6 +12,7 @@ import com.aizuda.easy.retry.server.support.RetryContext;
import com.aizuda.easy.retry.server.support.WaitStrategy;
import com.aizuda.easy.retry.server.support.context.MaxAttemptsPersistenceRetryContext;
import lombok.Data;
import lombok.Getter;
import java.text.ParseException;
import java.time.LocalDateTime;
@ -34,6 +35,7 @@ public class WaitStrategies {
private WaitStrategies() {
}
@Getter
public enum WaitStrategyEnum {
DELAY_LEVEL(1, delayLevelWait()),
FIXED(2, fixedWait()),

View File

@ -46,6 +46,11 @@ public class GroupConfigRequestVO {
*/
private Integer idGeneratorMode;
/**
* 是否初始化场景
*/
private Integer initScene;
/**
* 通知列表
*/

View File

@ -30,6 +30,8 @@ public class GroupConfigResponseVO {
private String idGeneratorModeName;
private Integer initScene;
private List<String> onlinePodList;
private LocalDateTime createDt;

View File

@ -9,12 +9,13 @@
<result column="group_partition" jdbcType="TINYINT" property="groupPartition" />
<result column="route_key" jdbcType="TINYINT" property="routeKey" />
<result column="id_generator_mode" jdbcType="TINYINT" property="idGeneratorMode" />
<result column="init_scene" jdbcType="TINYINT" property="initScene" />
<result column="description" jdbcType="TINYINT" property="description" />
<result column="create_dt" jdbcType="TIMESTAMP" property="createDt" />
<result column="update_dt" jdbcType="TIMESTAMP" property="updateDt" />
</resultMap>
<sql id="Base_Column_List">
id, `group_name`, group_status, version, `group_partition`, route_key, id_generator_mode, description, create_dt, update_dt
id, `group_name`, group_status, version, `group_partition`, route_key, id_generator_mode, init_scene description, create_dt, update_dt
</sql>
</mapper>

View File

@ -26,5 +26,4 @@ public class RetryRegisterService {
return "这是一个简单的异常方法";
}
}

View File

@ -44,6 +44,9 @@
<span slot="groupStatus" slot-scope="text">
{{ text === 0 ? '停用': '启用' }}
</span>
<span slot="initScene" slot-scope="text">
{{ text === 0 ? '否': '是' }}
</span>
<span slot="action" slot-scope="text, record">
<template>
<a @click="handleEdit(record)">编辑</a>
@ -107,6 +110,11 @@ export default {
title: 'ID生成模式',
dataIndex: 'idGeneratorModeName'
},
{
title: '初始化场景',
dataIndex: 'initScene',
scopedSlots: { customRender: 'initScene' }
},
{
title: '更新时间',
dataIndex: 'updateDt',

View File

@ -77,6 +77,19 @@
label="Id生成模式">
<a-select
placeholder="请选择Id生成模式"
v-decorator="[
'initScene',
{rules: [{ required: true, message: '请选择Id生成模式'}]}
]" >
<a-select-option :value="key" v-for="(value, key) in initScene" :key="key">{{ value }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :lg="3" :md="6" :sm="12">
<a-form-item
label="初始化场景">
<a-select
placeholder="请选择是否初始化场景"
v-decorator="[
'idGeneratorMode',
{rules: [{ required: true, message: '请选择Id生成模式'}]}
@ -116,6 +129,10 @@ export default {
idGenMode: {
'1': '号段模式',
'2': '雪花算法'
},
initScene: {
'0': '否',
'1': '是'
}
}
},
@ -159,13 +176,13 @@ export default {
new Promise((resolve) => {
setTimeout(resolve, 1500)
}).then(() => {
const formData = pick(data, ['id', 'groupName', 'routeKey', 'groupStatus', 'description', 'groupPartition', 'idGeneratorMode'])
const formData = pick(data, ['id', 'groupName', 'routeKey', 'groupStatus', 'description', 'groupPartition', 'idGeneratorMode', 'initScene'])
formData.groupStatus = formData.groupStatus.toString()
formData.routeKey = formData.routeKey.toString()
formData.idGeneratorMode = formData.idGeneratorMode.toString()
formData.initScene = formData.initScene.toString()
this.id = formData.id
console.log('formData', formData)
form.setFieldsValue(formData)
})
}