feat(sj_1.1.0): 调试决策节点
This commit is contained in:
parent
5391fe1d18
commit
758a9875d7
@ -112,9 +112,6 @@ public class WorkflowExecutorActor extends AbstractActor {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO 暂时删除,待认证
|
||||
// Sets.SetView<Long> union = Sets.union(allSuccessors, brotherNode);
|
||||
|
||||
// 添加父节点,为了判断父节点的处理状态
|
||||
List<JobTaskBatch> allJobTaskBatchList = jobTaskBatchMapper.selectList(new LambdaQueryWrapper<JobTaskBatch>()
|
||||
.select(JobTaskBatch::getWorkflowTaskBatchId, JobTaskBatch::getWorkflowNodeId,
|
||||
@ -155,23 +152,35 @@ public class WorkflowExecutorActor extends AbstractActor {
|
||||
}
|
||||
}
|
||||
|
||||
if (!brotherNodeIsComplete(taskExecute, brotherNode, jobTaskBatchMap, parentWorkflowNode)) {
|
||||
return;
|
||||
}
|
||||
// 决策节点
|
||||
if (Objects.nonNull(parentWorkflowNode) && WorkflowNodeTypeEnum.DECISION.getType() == parentWorkflowNode.getNodeType()) {
|
||||
|
||||
// 去掉父节点
|
||||
workflowNodes = workflowNodes.stream()
|
||||
.filter(workflowNode -> !workflowNode.getId().equals(taskExecute.getParentId()))
|
||||
.collect(Collectors.toList());
|
||||
// 获取决策节点子节点
|
||||
Set<Long> successors = graph.successors(parentWorkflowNode.getId());
|
||||
workflowNodes = workflowNodes.stream()
|
||||
// 去掉父节点
|
||||
.filter(workflowNode -> !workflowNode.getId().equals(taskExecute.getParentId())
|
||||
// 过滤掉非当前决策节点【ParentId】的子节点
|
||||
&& successors.contains(workflowNode.getId())).collect(Collectors.toList());
|
||||
} else {
|
||||
if (!brotherNodeIsComplete(taskExecute, brotherNode, jobTaskBatchMap, parentWorkflowNode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
workflowNodes = workflowNodes.stream()
|
||||
// 去掉父节点
|
||||
.filter(workflowNode -> !workflowNode.getId().equals(taskExecute.getParentId()))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// TODO 合并job task的结果到全局上下文中
|
||||
// 此次的并发数与当时父节点的兄弟节点的数量一致
|
||||
workflowBatchHandler.mergeWorkflowContextAndRetry(workflowTaskBatch,
|
||||
StreamUtils.toSet(allJobTaskBatchList, JobTaskBatch::getId));
|
||||
}
|
||||
|
||||
List<Job> jobs = jobMapper.selectBatchIds(StreamUtils.toSet(workflowNodes, WorkflowNode::getJobId));
|
||||
Map<Long, Job> jobMap = StreamUtils.toIdentityMap(jobs, Job::getId);
|
||||
|
||||
// TODO 合并job task的结果到全局上下文中
|
||||
// 此次的并发数与当时父节点的兄弟节点的数量一致
|
||||
workflowBatchHandler.mergeWorkflowContextAndRetry(workflowTaskBatch,
|
||||
StreamUtils.toSet(allJobTaskBatchList, JobTaskBatch::getId));
|
||||
|
||||
// 只会条件节点会使用
|
||||
Object evaluationResult = null;
|
||||
for (WorkflowNode workflowNode : workflowNodes) {
|
||||
|
@ -148,8 +148,6 @@ public abstract class AbstractWorkflowExecutor implements WorkflowExecutor, Init
|
||||
jobTask.setClientInfo(StrUtil.EMPTY);
|
||||
jobTask.setTaskBatchId(jobTaskBatch.getId());
|
||||
jobTask.setArgsType(JobArgsTypeEnum.TEXT.getArgsType());
|
||||
// TODO 待定是否删除
|
||||
jobTask.setArgsStr(Optional.ofNullable(context.getTaskResult()).orElse(StrUtil.EMPTY));
|
||||
jobTask.setTaskStatus(context.getJobTaskStatus());
|
||||
jobTask.setResultMessage(String.valueOf(context.getEvaluationResult()));
|
||||
Assert.isTrue(1 == jobTaskMapper.insert(jobTask), () -> new SnailJobServerException("新增任务实例失败"));
|
||||
|
@ -16,12 +16,16 @@ import com.aizuda.snailjob.server.common.exception.SnailJobServerException;
|
||||
import com.aizuda.snailjob.server.job.task.support.alarm.event.WorkflowTaskFailAlarmEvent;
|
||||
import com.aizuda.snailjob.server.job.task.support.expression.ExpressionInvocationHandler;
|
||||
import com.aizuda.snailjob.template.datasource.persistence.mapper.JobTaskMapper;
|
||||
import com.aizuda.snailjob.template.datasource.persistence.mapper.WorkflowTaskBatchMapper;
|
||||
import com.aizuda.snailjob.template.datasource.persistence.po.JobTask;
|
||||
import com.aizuda.snailjob.template.datasource.persistence.po.JobTaskBatch;
|
||||
import com.aizuda.snailjob.template.datasource.persistence.po.WorkflowTaskBatch;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
@ -33,8 +37,7 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor
|
||||
@Slf4j
|
||||
public class DecisionWorkflowExecutor extends AbstractWorkflowExecutor {
|
||||
private final JobTaskMapper jobTaskMapper;
|
||||
|
||||
private final WorkflowTaskBatchMapper workflowTaskBatchMapper;
|
||||
|
||||
@Override
|
||||
public WorkflowNodeTypeEnum getWorkflowNodeType() {
|
||||
@ -64,14 +67,24 @@ public class DecisionWorkflowExecutor extends AbstractWorkflowExecutor {
|
||||
DecisionConfig decisionConfig = JsonUtil.parseObject(context.getNodeInfo(), DecisionConfig.class);
|
||||
if (StatusEnum.NO.getStatus().equals(decisionConfig.getDefaultDecision())) {
|
||||
try {
|
||||
ExpressionEngine realExpressionEngine = ExpressionTypeEnum.valueOf(decisionConfig.getExpressionType());
|
||||
Assert.notNull(realExpressionEngine, () -> new SnailJobServerException("表达式引擎不存在"));
|
||||
ExpressionInvocationHandler invocationHandler = new ExpressionInvocationHandler(realExpressionEngine);
|
||||
ExpressionEngine expressionEngine = ExpressionFactory.getExpressionEngine(invocationHandler);
|
||||
result = (Boolean) Optional.ofNullable(expressionEngine.eval(decisionConfig.getNodeExpression(), context.getWfContext())).orElse(Boolean.FALSE);
|
||||
if (!result) {
|
||||
// 这里重新加载一次最新的上下文
|
||||
WorkflowTaskBatch workflowTaskBatch = workflowTaskBatchMapper.selectOne(new LambdaQueryWrapper<WorkflowTaskBatch>()
|
||||
.select(WorkflowTaskBatch::getWfContext)
|
||||
.eq(WorkflowTaskBatch::getId, context.getWorkflowTaskBatchId())
|
||||
);
|
||||
if (Objects.isNull(workflowTaskBatch)) {
|
||||
operationReason = JobOperationReasonEnum.WORKFLOW_DECISION_FAILED.getReason();
|
||||
} else {
|
||||
ExpressionEngine realExpressionEngine = ExpressionTypeEnum.valueOf(decisionConfig.getExpressionType());
|
||||
Assert.notNull(realExpressionEngine, () -> new SnailJobServerException("表达式引擎不存在"));
|
||||
ExpressionInvocationHandler invocationHandler = new ExpressionInvocationHandler(realExpressionEngine);
|
||||
ExpressionEngine expressionEngine = ExpressionFactory.getExpressionEngine(invocationHandler);
|
||||
result = (Boolean) Optional.ofNullable(expressionEngine.eval(decisionConfig.getNodeExpression(), workflowTaskBatch.getWfContext())).orElse(Boolean.FALSE);
|
||||
if (!result) {
|
||||
operationReason = JobOperationReasonEnum.WORKFLOW_DECISION_FAILED.getReason();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("执行条件表达式解析异常. 表达式:[{}],参数: [{}]", decisionConfig.getNodeExpression(), context.getWfContext(), e);
|
||||
taskBatchStatus = JobTaskBatchStatusEnum.FAIL.getStatus();
|
||||
@ -85,9 +98,9 @@ public class DecisionWorkflowExecutor extends AbstractWorkflowExecutor {
|
||||
}
|
||||
}
|
||||
|
||||
if (JobTaskBatchStatusEnum.SUCCESS.getStatus() == taskBatchStatus && result) {
|
||||
workflowTaskExecutor(context);
|
||||
}
|
||||
// if (JobTaskBatchStatusEnum.SUCCESS.getStatus() == taskBatchStatus && result) {
|
||||
// workflowTaskExecutor(context);
|
||||
// }
|
||||
|
||||
// 回传执行结果
|
||||
context.setEvaluationResult(result);
|
||||
|
Loading…
Reference in New Issue
Block a user