dolphinscheduler 初始化任务队列 initTaskQueue

简要说明

  • 疑问
笔者刚看到这里感觉很奇怪,因为当processInstance第一次执行的时候,如果不是ComplementData 类型的。initTaskQueue 方法基本上只执行clear方法。为什么写那么多
  • 解答
在api服务中执行任务流程生成任务实例时,是生成command插入表中,在master中将command转换成processInstance,此时执行状态可能是WorkflowExecutionStatus.SERIAL_WAIT,此时就不是RUNNING_EXECUTION 状态,可能是专门为这种类型准备的。

 private void initTaskQueue() {

        taskFailedSubmit = false;
        activeTaskProcessorMaps.clear();
        dependFailedTaskMap.clear();
        completeTaskMap.clear();
        errorTaskMap.clear();
//1.如果该流程实例重新恢复的返回false 2.如果任务流程实例是RUNNING_EXECUTION 状态,并且是第一次运行则返回true 3.其他则返回false
        if (!isNewProcessInstance()) {
        //如果不是新的流程实例了,找到taskInstance表中,process_instance_id =  processInstance.getId()并且flag=1 的(1为可获得)

            List<TaskInstance> validTaskInstanceList = processService.findValidTaskListByProcessId(processInstance.getId());
            for (TaskInstance task : validTaskInstanceList) {
            //将validTaskMap缓存中相同code的任务实例替换
                if (validTaskMap.containsKey(task.getTaskCode())) {
                    int oldTaskInstanceId = validTaskMap.get(task.getTaskCode());
                    TaskInstance oldTaskInstance = taskInstanceMap.get(oldTaskInstanceId);
                    if (!oldTaskInstance.getState().typeIsFinished() && task.getState().typeIsFinished()) {
                    //如果结束了就设置成不可获取,并更新到数据库中
                        task.setFlag(Flag.NO);
                        processService.updateTaskInstance(task);
                        continue;
                    }
                    logger.warn("have same taskCode taskInstance when init task queue, taskCode:{}", task.getTaskCode());
                }

                validTaskMap.put(task.getTaskCode(), task.getId());
                taskInstanceMap.put(task.getId(), task);
				//如果该任务完成了就放入完成任务的缓存中
                if (task.isTaskComplete()) {
                    completeTaskMap.put(task.getTaskCode(), task.getId());
                    continue;
                }
                //如果该任务是conditions 节点类型的任务 或者后续有conditions节点类型的任务则跳过
                if (task.isConditionsTask() || DagHelper.haveConditionsAfterNode(Long.toString(task.getTaskCode()), dag)) {
                    continue;
                }
                if (task.taskCanRetry()) {
                    if (task.getState() == ExecutionStatus.NEED_FAULT_TOLERANCE) {
                        // tolerantTaskInstance add to standby list directly
                        TaskInstance tolerantTaskInstance = cloneTolerantTaskInstance(task);
                        addTaskToStandByList(tolerantTaskInstance);
                    } else {
                        retryTaskInstance(task);
                    }
                    continue;
                }
                //如果失败则放入失败任务缓存中
                if (task.getState().typeIsFailure()) {
                    errorTaskMap.put(task.getTaskCode(), task.getId());
                }
            }
        }
		//如果processInstance的历史cmd的commandType 是CommandType.COMPLEMENT_DATA类型的 并且complementListDate大小是0
        if (processInstance.isComplementData() && complementListDate.size() == 0) {
            Map<String, String> cmdParam = JSONUtils.toMap(processInstance.getCommandParam());
            if (cmdParam != null && cmdParam.containsKey(CMDPARAM_COMPLEMENT_DATA_START_DATE)) {
                // reset global params while there are start parameters
                setGlobalParamIfCommanded(processDefinition, cmdParam);

                Date start = DateUtils.stringToDate(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_START_DATE));
                Date end = DateUtils.stringToDate(cmdParam.get(CMDPARAM_COMPLEMENT_DATA_END_DATE));
                List<Schedule> schedules = processService.queryReleaseSchedulerListByProcessDefinitionCode(processInstance.getProcessDefinitionCode());
                if (complementListDate.size() == 0 && needComplementProcess()) {
                    complementListDate = CronUtils.getSelfFireDateList(start, end, schedules);
                    logger.info(" process definition code:{} complement data: {}",
                        processInstance.getProcessDefinitionCode(), complementListDate.toString());

                    if (complementListDate.size() > 0 && Flag.NO == processInstance.getIsSubProcess()) {
                        processInstance.setScheduleTime(complementListDate.get(0));
                        processInstance.setGlobalParams(ParameterUtils.curingGlobalParams(
                            processDefinition.getGlobalParamMap(),
                            processDefinition.getGlobalParamList(),
                            CommandType.COMPLEMENT_DATA, processInstance.getScheduleTime(), cmdParam.get(Constants.SCHEDULE_TIMEZONE)));
                        processService.updateProcessInstance(processInstance);
                    }
                }
            }
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值