修复下游传递非重试status code 时候不在进行重试
This commit is contained in:
byteblogs168 2023-01-14 20:00:14 +08:00
parent 39abb25373
commit 3c38542315
14 changed files with 41 additions and 18 deletions

View File

@ -64,8 +64,7 @@
<dependency> <dependency>
<groupId>org.awaitility</groupId> <groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId> <artifactId>awaitility</artifactId>
<version>2.0.0</version> <version>4.1.1</version>
<scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>

View File

@ -39,7 +39,7 @@ public class ExistsTransactionalRetryServiceTest {
Mockito.when(remoteService.call()) Mockito.when(remoteService.call())
.thenReturn(new Result(0, "1")) .thenReturn(new Result(0, "1"))
.thenReturn(new Result(0, "2")) .thenReturn(new Result(0, "2"))
.thenReturn(new Result(1, "3")) .thenReturn(new Result(0, "3"))
.thenReturn(new Result(0, "4")) .thenReturn(new Result(0, "4"))
.thenReturn(new Result(0, "5")) .thenReturn(new Result(0, "5"))
; ;
@ -89,7 +89,7 @@ public class ExistsTransactionalRetryServiceTest {
.thenReturn(new Result(0, "5")) .thenReturn(new Result(0, "5"))
; ;
try { try {
for (int i = 0; i < 100; i++) { for (int i = 0; i < 400; i++) {
threadPoolExecutor.execute(() -> testExistsTransactionalRetryService.testSimpleInsert(UUID.randomUUID().toString())); threadPoolExecutor.execute(() -> testExistsTransactionalRetryService.testSimpleInsert(UUID.randomUUID().toString()));
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -7,7 +7,7 @@
<template> <template>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="组名称"> <a-form-item label="组名称">
<a-input v-model="queryParam.groupName" placeholder="请输入组名称"/> <a-input v-model="queryParam.groupName" placeholder="请输入组名称" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>

View File

@ -6,7 +6,7 @@
<template> <template>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="场景名称"> <a-form-item label="场景名称">
<a-input v-model="queryParam.sceneName" placeholder="请输入场景名称"/> <a-input v-model="queryParam.sceneName" placeholder="请输入场景名称" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>

View File

@ -12,7 +12,7 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="场景名称"> <a-form-item label="场景名称">
<a-select v-model="queryParam.sceneName" placeholder="请选择场景名称"> <a-select v-model="queryParam.sceneName" placeholder="请选择场景名称" allowClear>
<a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option> <a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
@ -20,12 +20,12 @@
<template v-if="advanced"> <template v-if="advanced">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务编号"> <a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/> <a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id"/> <a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>

View File

@ -5,14 +5,14 @@
<a-row :gutter="48"> <a-row :gutter="48">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="组名称"> <a-form-item label="组名称">
<a-select v-model="queryParam.groupName" placeholder="请输入组名称" @change="value => handleChange(value)"> <a-select v-model="queryParam.groupName" placeholder="请输入组名称" @change="value => handleChange(value)" allowClear>
<a-select-option v-for="item in groupNameList" :value="item" :key="item">{{ item }}</a-select-option> <a-select-option v-for="item in groupNameList" :value="item" :key="item">{{ item }}</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="场景名称"> <a-form-item label="场景名称">
<a-select v-model="queryParam.sceneName" placeholder="请选择场景名称"> <a-select v-model="queryParam.sceneName" placeholder="请选择场景名称" allowClear>
<a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option> <a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
@ -20,12 +20,12 @@
<template v-if="advanced"> <template v-if="advanced">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务编号"> <a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/> <a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id"/> <a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>

View File

@ -12,20 +12,27 @@
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="场景名称"> <a-form-item label="场景名称">
<a-select v-model="queryParam.sceneName" placeholder="请选择场景名称"> <a-select v-model="queryParam.sceneName" placeholder="请选择场景名称" allowClear>
<a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option> <a-select-option v-for="item in sceneList" :value="item.sceneName" :key="item.sceneName"> {{ item.sceneName }}</a-select-option>
</a-select> </a-select>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24">
<a-form-item label="重试状态">
<a-select v-model="queryParam.retryStatus" placeholder="请选择状态" allowClear>
<a-select-option v-for="(value, key) in retryStatus" :value="key" :key="key"> {{ value }}</a-select-option>
</a-select>
</a-form-item>
</a-col>
<template v-if="advanced"> <template v-if="advanced">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务编号"> <a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/> <a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="业务id"> <a-form-item label="业务id">
<a-input v-model="queryParam.bizId" placeholder="请输入业务id"/> <a-input v-model="queryParam.bizId" placeholder="请输入业务id" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
</template> </template>

View File

@ -6,7 +6,7 @@
<a-row :gutter="48"> <a-row :gutter="48">
<a-col :md="8" :sm="24"> <a-col :md="8" :sm="24">
<a-form-item label="用户名"> <a-form-item label="用户名">
<a-input v-model="queryParam.username" placeholder="请输入用户名"/> <a-input v-model="queryParam.username" placeholder="请输入用户名" allowClear/>
</a-form-item> </a-form-item>
</a-col> </a-col>
<a-col :md="!advanced && 8 || 24" :sm="24"> <a-col :md="!advanced && 8 || 24" :sm="24">

View File

@ -12,6 +12,7 @@ import com.x.retry.client.core.strategy.RetryStrategy;
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.enums.RetryResultStatusEnum; import com.x.retry.common.core.enums.RetryResultStatusEnum;
import com.x.retry.common.core.log.LogUtils;
import com.x.retry.common.core.model.Result; import com.x.retry.common.core.model.Result;
import com.x.retry.common.core.util.JsonUtil; import com.x.retry.common.core.util.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@ -69,6 +69,12 @@ public class HeaderAspect {
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());
// 服务端重试的在com.x.retry.client.core.client.RetryEndPoint 中进行清除threadLocal
if (Objects.nonNull(RetrySiteSnapshot.getStage()) && RetrySiteSnapshot.EnumStage.REMOTE.getStage() == RetrySiteSnapshot.getStage()) {
return;
}
// 这里清除是为了,非服务端直接触发的节点需要清除 threadLocal里面的标记
RetrySiteSnapshot.removeRetryHeader(); RetrySiteSnapshot.removeRetryHeader();
RetrySiteSnapshot.removeRetryStatusCode(); RetrySiteSnapshot.removeRetryStatusCode();
RetrySiteSnapshot.removeEntryMethodTime(); RetrySiteSnapshot.removeEntryMethodTime();

View File

@ -135,6 +135,9 @@ public class RetrySiteSnapshot {
RETRY_CLASS_METHOD_ENTRANCE.remove(); RETRY_CLASS_METHOD_ENTRANCE.remove();
RETRY_STAGE.remove(); RETRY_STAGE.remove();
removeEntryMethodTime();
removeRetryHeader();
removeRetryStatusCode();
} }
/** /**

View File

@ -35,7 +35,8 @@ public class MybatisRetryTaskAccess extends AbstractRetryTaskAccess {
return retryTaskMapper.selectPage(new PageDTO<>(0, pageSize), return retryTaskMapper.selectPage(new PageDTO<>(0, pageSize),
new LambdaQueryWrapper<RetryTask>() new LambdaQueryWrapper<RetryTask>()
.eq(RetryTask::getRetryStatus, RetryStatusEnum.RUNNING.getLevel()) .eq(RetryTask::getRetryStatus, RetryStatusEnum.RUNNING.getLevel())
.eq(RetryTask::getGroupName, groupName).ge(RetryTask::getCreateDt, lastAt)).getRecords(); .eq(RetryTask::getGroupName, groupName).ge(RetryTask::getCreateDt, lastAt)
.orderByAsc(RetryTask::getCreateDt)).getRecords();
} }
@Override @Override

View File

@ -17,6 +17,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
/** /**
* @author www.byteblogs.com * @author www.byteblogs.com
@ -53,6 +54,9 @@ public class RetryTaskServiceImpl implements RetryTaskService {
if (StringUtils.isNotBlank(queryVO.getBizId())) { if (StringUtils.isNotBlank(queryVO.getBizId())) {
retryTaskLambdaQueryWrapper.eq(RetryTask::getBizId, queryVO.getBizId()); retryTaskLambdaQueryWrapper.eq(RetryTask::getBizId, queryVO.getBizId());
} }
if (Objects.nonNull(queryVO.getRetryStatus())) {
retryTaskLambdaQueryWrapper.eq(RetryTask::getRetryStatus, queryVO.getRetryStatus());
}
RequestDataHelper.setPartition(queryVO.getGroupName()); RequestDataHelper.setPartition(queryVO.getGroupName());

View File

@ -18,4 +18,6 @@ public class RetryTaskQueryVO extends BaseQueryVO {
private String bizNo; private String bizNo;
private String bizId; private String bizId;
private Integer retryStatus;
} }