feat(1.4.0-beta1): 1. 修复重试任务批量删除失败问题

This commit is contained in:
opensnail 2025-02-23 19:47:10 +08:00
parent abe08bed5c
commit c32d1c5426
6 changed files with 33 additions and 24 deletions

View File

@ -150,7 +150,7 @@ CREATE TABLE `sj_retry_task`
`task_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '重试状态', `task_status` tinyint(4) NOT NULL DEFAULT 1 COMMENT '重试状态',
`task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据', `task_type` tinyint(4) NOT NULL DEFAULT 1 COMMENT '任务类型 1、重试数据 2、回调数据',
`operation_reason` tinyint(4) NOT NULL DEFAULT 0 COMMENT '操作原因', `operation_reason` tinyint(4) NOT NULL DEFAULT 0 COMMENT '操作原因',
`client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port', `client_info` varchar(128) DEFAULT NULL COMMENT '客户端地址 clientId#ip:port',
`create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_dt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`), PRIMARY KEY (`id`),

View File

@ -41,7 +41,7 @@ public class RetryController {
@LoginRequired @LoginRequired
@PutMapping("status") @PutMapping("status")
public int updateRetryTaskStatus(@RequestBody RetryUpdateStatusRequestVO retryUpdateStatusRequestVO) { public int updateRetryTaskStatus(@RequestBody RetryUpdateStatusRequestVO retryUpdateStatusRequestVO) {
return retryService.updateRetryTaskStatus(retryUpdateStatusRequestVO); return retryService.updateRetryStatus(retryUpdateStatusRequestVO);
} }
@LoginRequired @LoginRequired

View File

@ -1,8 +1,8 @@
package com.aizuda.snailjob.server.web.model.request; package com.aizuda.snailjob.server.web.model.request;
import com.aizuda.snailjob.common.core.enums.RetryStatusEnum; import com.aizuda.snailjob.common.core.enums.RetryStatusEnum;
import jakarta.validation.constraints.NotBlank;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
/** /**
* 重试数据模型 * 重试数据模型

View File

@ -30,7 +30,7 @@ public interface RetryService {
* @param retryUpdateStatusRequestVO 更新重试任务状态请求模型 * @param retryUpdateStatusRequestVO 更新重试任务状态请求模型
* @return * @return
*/ */
int updateRetryTaskStatus(RetryUpdateStatusRequestVO retryUpdateStatusRequestVO); int updateRetryStatus(RetryUpdateStatusRequestVO retryUpdateStatusRequestVO);
/** /**
* 手动新增重试任务 * 手动新增重试任务

View File

@ -54,8 +54,10 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.*;
@ -83,6 +85,8 @@ public class RetryServiceImpl implements RetryService {
private List<TaskGenerator> taskGenerators; private List<TaskGenerator> taskGenerators;
@Autowired @Autowired
private RetryTaskLogMessageMapper retryTaskLogMessageMapper; private RetryTaskLogMessageMapper retryTaskLogMessageMapper;
@Autowired
private TransactionTemplate transactionTemplate;
@Override @Override
public PageResult<List<RetryResponseVO>> getRetryPage(RetryQueryVO queryVO) { public PageResult<List<RetryResponseVO>> getRetryPage(RetryQueryVO queryVO) {
@ -141,7 +145,7 @@ public class RetryServiceImpl implements RetryService {
@Override @Override
@Transactional @Transactional
public int updateRetryTaskStatus(RetryUpdateStatusRequestVO requestVO) { public int updateRetryStatus(RetryUpdateStatusRequestVO requestVO) {
RetryStatusEnum retryStatusEnum = RetryStatusEnum.getByStatus(requestVO.getRetryStatus()); RetryStatusEnum retryStatusEnum = RetryStatusEnum.getByStatus(requestVO.getRetryStatus());
if (Objects.isNull(retryStatusEnum)) { if (Objects.isNull(retryStatusEnum)) {
@ -178,13 +182,6 @@ public class RetryServiceImpl implements RetryService {
retryLogMetaDTO.setTimestamp(DateUtils.toNowMilli()); retryLogMetaDTO.setTimestamp(DateUtils.toNowMilli());
SnailJobLog.REMOTE.info("=============手动操作完成============. <|>{}<|>", retryLogMetaDTO); SnailJobLog.REMOTE.info("=============手动操作完成============. <|>{}<|>", retryLogMetaDTO);
} }
//
// RetryTask retryTask = new RetryTask();
// retryTask.setTaskStatus(requestVO.getRetryStatus());
// retryTaskMapper.update(retryTask, new LambdaUpdateWrapper<RetryTask>()
// .eq(RetryTask::getNamespaceId, namespaceId)
// .eq(RetryTask::getUniqueId, retry.getUniqueId())
// .eq(RetryTask::getGroupName, retry.getGroupName()));
retry.setUpdateDt(LocalDateTime.now()); retry.setUpdateDt(LocalDateTime.now());
return retryTaskAccess.updateById(retry); return retryTaskAccess.updateById(retry);
@ -351,16 +348,25 @@ public class RetryServiceImpl implements RetryService {
String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId(); String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId();
map.forEach(((sceneName, retryTaskDTOS) -> { transactionTemplate.execute((status -> {
TaskContext taskContext = new TaskContext(); map.forEach(((sceneName, retryTaskDTOS) -> {
taskContext.setSceneName(sceneName); TaskContext taskContext = new TaskContext();
taskContext.setGroupName(parseLogsVO.getGroupName()); taskContext.setSceneName(sceneName);
taskContext.setNamespaceId(namespaceId); taskContext.setGroupName(parseLogsVO.getGroupName());
taskContext.setInitStatus(parseLogsVO.getRetryStatus()); taskContext.setNamespaceId(namespaceId);
taskContext.setTaskInfos(TaskContextConverter.INSTANCE.convert(retryTaskDTOS)); taskContext.setInitStatus(parseLogsVO.getRetryStatus());
taskContext.setTaskInfos(TaskContextConverter.INSTANCE.convert(retryTaskDTOS));
// 生成任务 // 生成任务
taskGenerator.taskGenerator(taskContext); try {
taskGenerator.taskGenerator(taskContext);
} catch (DuplicateKeyException e) {
throw new SnailJobServerException("namespaceId:[{}] groupName:[{}] sceneName:[{}] 任务已经存在",
namespaceId, parseLogsVO.getGroupName(), sceneName);
}
}));
return Boolean.TRUE;
})); }));
return waitInsertList.size(); return waitInsertList.size();

View File

@ -197,7 +197,7 @@ public class RetryTaskServiceImpl implements RetryTaskService {
List<RetryTask> retryTasks = retryTaskMapper.selectList( List<RetryTask> retryTasks = retryTaskMapper.selectList(
new LambdaQueryWrapper<RetryTask>() new LambdaQueryWrapper<RetryTask>()
.in(RetryTask::getTaskStatus, List.of(RetryStatusEnum.FINISH.getStatus(), RetryStatusEnum.MAX_COUNT.getStatus())) .in(RetryTask::getTaskStatus, RetryTaskStatusEnum.TERMINAL_STATUS_SET)
.eq(RetryTask::getNamespaceId, namespaceId) .eq(RetryTask::getNamespaceId, namespaceId)
.in(RetryTask::getId, ids)); .in(RetryTask::getId, ids));
Assert.notEmpty(retryTasks, () -> new SnailJobServerException("数据不存在")); Assert.notEmpty(retryTasks, () -> new SnailJobServerException("数据不存在"));
@ -216,8 +216,11 @@ public class RetryTaskServiceImpl implements RetryTaskService {
@Override @Override
public Boolean stopById(Long id) { public Boolean stopById(Long id) {
Retry retry = retryMapper.selectById(id); RetryTask retryTask = retryTaskMapper.selectById(id);
Assert.notNull(retry, () -> new SnailJobServerException("没有可执行的任务")); Assert.notNull(retryTask, () -> new SnailJobServerException("没有可执行的任务"));
Retry retry = retryMapper.selectById(retryTask.getRetryId());
Assert.notNull(retry, () -> new SnailJobServerException("任务不存在"));
TaskStopJobDTO taskStopJobDTO = RetryConverter.INSTANCE.toTaskStopJobDTO(retry); TaskStopJobDTO taskStopJobDTO = RetryConverter.INSTANCE.toTaskStopJobDTO(retry);
taskStopJobDTO.setOperationReason(RetryOperationReasonEnum.MANNER_STOP.getReason()); taskStopJobDTO.setOperationReason(RetryOperationReasonEnum.MANNER_STOP.getReason());