修复下游传递非重试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>
<groupId>org.awaitility</groupId>
<artifactId>awaitility</artifactId>
<version>2.0.0</version>
<scope>test</scope>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>

View File

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

View File

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

View File

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

View File

@ -12,7 +12,7 @@
</a-col>
<a-col :md="8" :sm="24">
<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>
</a-form-item>
@ -20,12 +20,12 @@
<template v-if="advanced">
<a-col :md="8" :sm="24">
<a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/>
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<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-col>
</template>

View File

@ -5,14 +5,14 @@
<a-row :gutter="48">
<a-col :md="8" :sm="24">
<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>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<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>
</a-form-item>
@ -20,12 +20,12 @@
<template v-if="advanced">
<a-col :md="8" :sm="24">
<a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/>
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<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-col>
</template>

View File

@ -12,20 +12,27 @@
</a-col>
<a-col :md="8" :sm="24">
<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>
</a-form-item>
</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">
<a-col :md="8" :sm="24">
<a-form-item label="业务编号">
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号"/>
<a-input v-model="queryParam.bizNo" placeholder="请输入业务编号" allowClear/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<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-col>
</template>

View File

@ -6,7 +6,7 @@
<a-row :gutter="48">
<a-col :md="8" :sm="24">
<a-form-item label="用户名">
<a-input v-model="queryParam.username" placeholder="请输入用户名"/>
<a-input v-model="queryParam.username" placeholder="请输入用户名" allowClear/>
</a-form-item>
</a-col>
<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.DispatchRetryResultDTO;
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.util.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;

View File

@ -69,6 +69,12 @@ public class HeaderAspect {
HttpServletResponse response = attributes.getResponse();
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.removeRetryStatusCode();
RetrySiteSnapshot.removeEntryMethodTime();

View File

@ -135,6 +135,9 @@ public class RetrySiteSnapshot {
RETRY_CLASS_METHOD_ENTRANCE.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),
new LambdaQueryWrapper<RetryTask>()
.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

View File

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

View File

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