feat: 2.6.0
1. 修复定时任务和工作流未过滤关闭组问题 2. 修复工作流详情未过滤命名空间问题 3. 工作流详情添加定时任务名称
This commit is contained in:
parent
09b0854184
commit
b8a2322cbb
@ -15,7 +15,10 @@ public class JobTaskConfig {
|
||||
/**
|
||||
* 任务ID
|
||||
*/
|
||||
@NotNull(message = "任务ID不能为空")
|
||||
private Long jobId;
|
||||
|
||||
/**
|
||||
* 任务名称
|
||||
*/
|
||||
private String jobName;
|
||||
}
|
||||
|
@ -20,10 +20,13 @@ import com.aizuda.easy.retry.server.job.task.support.JobTaskConverter;
|
||||
import com.aizuda.easy.retry.server.job.task.dto.JobPartitionTaskDTO;
|
||||
import com.aizuda.easy.retry.server.job.task.dto.JobTaskPrepareDTO;
|
||||
import com.aizuda.easy.retry.server.job.task.support.cache.ResidentTaskCache;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.GroupConfigMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.GroupConfig;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
||||
@ -32,6 +35,7 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
|
||||
/**
|
||||
@ -44,12 +48,12 @@ import java.util.*;
|
||||
@Component(ActorGenerator.SCAN_JOB_ACTOR)
|
||||
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class ScanJobTaskActor extends AbstractActor {
|
||||
|
||||
@Autowired
|
||||
private JobMapper jobMapper;
|
||||
@Autowired
|
||||
private SystemProperties systemProperties;
|
||||
private final JobMapper jobMapper;
|
||||
private final SystemProperties systemProperties;
|
||||
private final GroupConfigMapper groupConfigMapper;
|
||||
|
||||
@Override
|
||||
public Receive createReceive() {
|
||||
@ -166,11 +170,22 @@ public class ScanJobTaskActor extends AbstractActor {
|
||||
.eq(Job::getDeleted, StatusEnum.NO.getStatus())
|
||||
.ne(Job::getTriggerType, TriggerTypeEnum.WORKFLOW.getType())
|
||||
.in(Job::getBucketIndex, scanTask.getBuckets())
|
||||
.le(Job::getNextTriggerAt, DateUtils.toNowMilli() + DateUtils.toEpochMilli(SystemConstants.SCHEDULE_PERIOD))
|
||||
.le(Job::getNextTriggerAt,
|
||||
DateUtils.toNowMilli() + DateUtils.toEpochMilli(SystemConstants.SCHEDULE_PERIOD))
|
||||
.ge(Job::getId, startId)
|
||||
.orderByAsc(Job::getId)
|
||||
).getRecords();
|
||||
|
||||
// 过滤已关闭的组
|
||||
if (!CollectionUtils.isEmpty(jobs)) {
|
||||
List<String> groupConfigs = groupConfigMapper.selectList(new LambdaQueryWrapper<GroupConfig>()
|
||||
.select(GroupConfig::getGroupName)
|
||||
.eq(GroupConfig::getGroupStatus, StatusEnum.YES.getStatus())
|
||||
.eq(GroupConfig::getGroupName, jobs.stream().map(Job::getGroupName).collect(Collectors.toList())))
|
||||
.stream().map(GroupConfig::getGroupName).collect(Collectors.toList());
|
||||
jobs = jobs.stream().filter(job -> groupConfigs.contains(job.getGroupName())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
return JobTaskConverter.INSTANCE.toJobPartitionTasks(jobs);
|
||||
}
|
||||
}
|
||||
|
@ -18,7 +18,10 @@ import com.aizuda.easy.retry.server.common.util.PartitionTaskUtils;
|
||||
import com.aizuda.easy.retry.server.job.task.dto.WorkflowPartitionTaskDTO;
|
||||
import com.aizuda.easy.retry.server.job.task.dto.WorkflowTaskPrepareDTO;
|
||||
import com.aizuda.easy.retry.server.job.task.support.WorkflowTaskConverter;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.GroupConfigMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.GroupConfig;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Workflow;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
|
||||
@ -32,6 +35,7 @@ import org.springframework.util.CollectionUtils;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author xiaowoniu
|
||||
@ -45,6 +49,7 @@ import java.util.List;
|
||||
public class ScanWorkflowTaskActor extends AbstractActor {
|
||||
private final WorkflowMapper workflowMapper;
|
||||
private final SystemProperties systemProperties;
|
||||
private final GroupConfigMapper groupConfigMapper;
|
||||
|
||||
@Override
|
||||
public Receive createReceive() {
|
||||
@ -134,6 +139,16 @@ public class ScanWorkflowTaskActor extends AbstractActor {
|
||||
.orderByAsc(Workflow::getId)
|
||||
).getRecords();
|
||||
|
||||
// 过滤已关闭的组
|
||||
if (!CollectionUtils.isEmpty(workflows)) {
|
||||
List<String> groupConfigs = groupConfigMapper.selectList(new LambdaQueryWrapper<GroupConfig>()
|
||||
.select(GroupConfig::getGroupName)
|
||||
.eq(GroupConfig::getGroupStatus, StatusEnum.YES.getStatus())
|
||||
.eq(GroupConfig::getGroupName, workflows.stream().map(Workflow::getGroupName).collect(Collectors.toList())))
|
||||
.stream().map(GroupConfig::getGroupName).collect(Collectors.toList());
|
||||
workflows = workflows.stream().filter(workflow -> groupConfigs.contains(workflow.getGroupName())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
return WorkflowTaskConverter.INSTANCE.toWorkflowPartitionTaskList(workflows);
|
||||
}
|
||||
}
|
||||
|
@ -23,10 +23,12 @@ import com.aizuda.easy.retry.server.web.service.handler.WorkflowHandler;
|
||||
import com.aizuda.easy.retry.server.web.util.UserSessionUtils;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.dataobject.WorkflowBatchQueryDO;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.dataobject.WorkflowBatchResponseDO;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobTaskBatchMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowNodeMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowTaskBatchMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.JobTaskBatch;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Workflow;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.WorkflowNode;
|
||||
@ -62,6 +64,7 @@ public class WorkflowBatchServiceImpl implements WorkflowBatchService {
|
||||
private final JobTaskBatchMapper jobTaskBatchMapper;
|
||||
private final WorkflowHandler workflowHandler;
|
||||
private final WorkflowBatchHandler workflowBatchHandler;
|
||||
private final JobMapper jobMapper;
|
||||
|
||||
@Override
|
||||
public PageResult<List<WorkflowBatchResponseVO>> listPage(WorkflowBatchQueryVO queryVO) {
|
||||
@ -102,7 +105,10 @@ public class WorkflowBatchServiceImpl implements WorkflowBatchService {
|
||||
@Override
|
||||
public WorkflowDetailResponseVO getWorkflowBatchDetail(Long id) {
|
||||
|
||||
WorkflowTaskBatch workflowTaskBatch = workflowTaskBatchMapper.selectById(id);
|
||||
WorkflowTaskBatch workflowTaskBatch = workflowTaskBatchMapper.selectOne(
|
||||
new LambdaQueryWrapper<WorkflowTaskBatch>()
|
||||
.eq(WorkflowTaskBatch::getId, id)
|
||||
.eq(WorkflowTaskBatch::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId()));
|
||||
if (Objects.isNull(workflowTaskBatch)) {
|
||||
return null;
|
||||
}
|
||||
@ -114,6 +120,12 @@ public class WorkflowBatchServiceImpl implements WorkflowBatchService {
|
||||
.eq(WorkflowNode::getDeleted, StatusEnum.NO.getStatus())
|
||||
.eq(WorkflowNode::getWorkflowId, workflow.getId()));
|
||||
|
||||
List<Long> jobIds = workflowNodes.stream().map(WorkflowNode::getJobId).collect(Collectors.toList());
|
||||
List<Job> jobs = jobMapper.selectList(new LambdaQueryWrapper<Job>()
|
||||
.in(Job::getId, new HashSet<>(jobIds)));
|
||||
|
||||
Map<Long, Job> jobMap = jobs.stream().collect(Collectors.toMap(Job::getId, job -> job));
|
||||
|
||||
List<JobTaskBatch> alJobTaskBatchList = jobTaskBatchMapper.selectList(new LambdaQueryWrapper<JobTaskBatch>()
|
||||
.eq(JobTaskBatch::getWorkflowTaskBatchId, id).orderByDesc(JobTaskBatch::getId));
|
||||
|
||||
@ -127,6 +139,12 @@ public class WorkflowBatchServiceImpl implements WorkflowBatchService {
|
||||
Set<Long> allNoOperationNode = Sets.newHashSet();
|
||||
Map<Long, WorkflowDetailResponseVO.NodeInfo> workflowNodeMap = nodeInfos.stream()
|
||||
.peek(nodeInfo -> {
|
||||
|
||||
JobTaskConfig jobTask = nodeInfo.getJobTask();
|
||||
if(Objects.nonNull(jobTask)) {
|
||||
jobTask.setJobName(jobMap.getOrDefault(jobTask.getJobId(), new Job()).getJobName());
|
||||
}
|
||||
|
||||
List<JobTaskBatch> jobTaskBatchList = jobTaskBatchMap.get(nodeInfo.getId());
|
||||
if (!CollectionUtils.isEmpty(jobTaskBatchList)) {
|
||||
nodeInfo.setJobBatchList(JobBatchResponseVOConverter.INSTANCE.jobTaskBatchToJobBatchResponseVOs(jobTaskBatchList));
|
||||
|
@ -8,6 +8,7 @@ import com.aizuda.easy.retry.common.core.enums.StatusEnum;
|
||||
import com.aizuda.easy.retry.common.core.util.JsonUtil;
|
||||
import com.aizuda.easy.retry.server.common.WaitStrategy;
|
||||
import com.aizuda.easy.retry.server.common.config.SystemProperties;
|
||||
import com.aizuda.easy.retry.server.common.dto.JobTaskConfig;
|
||||
import com.aizuda.easy.retry.server.common.enums.JobTaskExecutorSceneEnum;
|
||||
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
|
||||
import com.aizuda.easy.retry.server.common.strategy.WaitStrategies;
|
||||
@ -30,8 +31,10 @@ import com.aizuda.easy.retry.server.web.service.WorkflowService;
|
||||
import com.aizuda.easy.retry.server.web.service.convert.WorkflowConverter;
|
||||
import com.aizuda.easy.retry.server.web.service.handler.WorkflowHandler;
|
||||
import com.aizuda.easy.retry.server.web.util.UserSessionUtils;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.JobMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.WorkflowNodeMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Job;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.Workflow;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.WorkflowNode;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
@ -66,6 +69,8 @@ public class WorkflowServiceImpl implements WorkflowService {
|
||||
private final WorkflowHandler workflowHandler;
|
||||
@Lazy
|
||||
private final WorkflowPrePareHandler terminalWorkflowPrepareHandler;
|
||||
private final JobMapper jobMapper;
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
@ -80,7 +85,8 @@ public class WorkflowServiceImpl implements WorkflowService {
|
||||
workflow.setVersion(1);
|
||||
workflow.setNextTriggerAt(calculateNextTriggerAt(workflowRequestVO, DateUtils.toNowMilli()));
|
||||
workflow.setFlowInfo(StrUtil.EMPTY);
|
||||
workflow.setBucketIndex(HashUtil.bkdrHash(workflowRequestVO.getGroupName() + workflowRequestVO.getWorkflowName())
|
||||
workflow.setBucketIndex(
|
||||
HashUtil.bkdrHash(workflowRequestVO.getGroupName() + workflowRequestVO.getWorkflowName())
|
||||
% systemProperties.getBucketTotal());
|
||||
workflow.setNamespaceId(UserSessionUtils.currentUserSession().getNamespaceId());
|
||||
Assert.isTrue(1 == workflowMapper.insert(workflow), () -> new EasyRetryServerException("新增工作流失败"));
|
||||
@ -130,7 +136,11 @@ public class WorkflowServiceImpl implements WorkflowService {
|
||||
@Override
|
||||
public WorkflowDetailResponseVO getWorkflowDetail(Long id) {
|
||||
|
||||
Workflow workflow = workflowMapper.selectById(id);
|
||||
Workflow workflow = workflowMapper.selectOne(
|
||||
new LambdaQueryWrapper<Workflow>()
|
||||
.eq(Workflow::getId, id)
|
||||
.eq(Workflow::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId())
|
||||
);
|
||||
if (Objects.isNull(workflow)) {
|
||||
return null;
|
||||
}
|
||||
@ -142,16 +152,28 @@ public class WorkflowServiceImpl implements WorkflowService {
|
||||
.eq(WorkflowNode::getWorkflowId, id)
|
||||
.orderByAsc(WorkflowNode::getPriorityLevel));
|
||||
|
||||
List<Long> jobIds = workflowNodes.stream().map(WorkflowNode::getJobId).collect(Collectors.toList());
|
||||
List<Job> jobs = jobMapper.selectList(new LambdaQueryWrapper<Job>()
|
||||
.in(Job::getId, new HashSet<>(jobIds)));
|
||||
|
||||
Map<Long, Job> jobMap = jobs.stream().collect(Collectors.toMap(Job::getId, job -> job));
|
||||
|
||||
List<WorkflowDetailResponseVO.NodeInfo> nodeInfos = WorkflowConverter.INSTANCE.toNodeInfo(workflowNodes);
|
||||
|
||||
Map<Long, WorkflowDetailResponseVO.NodeInfo> workflowNodeMap = nodeInfos.stream()
|
||||
.collect(Collectors.toMap(WorkflowDetailResponseVO.NodeInfo::getId, i -> i));
|
||||
.peek(nodeInfo -> {
|
||||
JobTaskConfig jobTask = nodeInfo.getJobTask();
|
||||
if (Objects.nonNull(jobTask)) {
|
||||
jobTask.setJobName(jobMap.getOrDefault(jobTask.getJobId(), new Job()).getJobName());
|
||||
}
|
||||
}).collect(Collectors.toMap(WorkflowDetailResponseVO.NodeInfo::getId, i -> i));
|
||||
|
||||
String flowInfo = workflow.getFlowInfo();
|
||||
try {
|
||||
MutableGraph<Long> graph = GraphUtils.deserializeJsonToGraph(flowInfo);
|
||||
// 反序列化构建图
|
||||
WorkflowDetailResponseVO.NodeConfig config = workflowHandler.buildNodeConfig(graph, SystemConstants.ROOT, new HashMap<>(),
|
||||
WorkflowDetailResponseVO.NodeConfig config = workflowHandler.buildNodeConfig(graph, SystemConstants.ROOT,
|
||||
new HashMap<>(),
|
||||
workflowNodeMap);
|
||||
responseVO.setNodeConfig(config);
|
||||
} catch (Exception e) {
|
||||
|
Loading…
Reference in New Issue
Block a user