目录
1.执行时机
客户端一个worker执行完成后,会调用该方法更新空中的数据信息
com.netflix.conductor.rest.controllers.TaskResource#updateTask
客户端会将worker的执行结果TaskResult回写到server端
2.核心方法
com.netflix.conductor.core.execution.WorkflowExecutor#updateTask
2.1 查询流程信息:
com.netflix.conductor.core.dal.ExecutionDAOFacade#getWorkflowModel
→ com.netflix.conductor.core.dal.ExecutionDAOFacade#getWorkflowModelFromDataStore
//查询表中流程信息
SELECT json_data FROM workflow WHERE workflow_id = ?
//若还需要查询流程中的任务(此流程中不需要)
SELECT task_id FROM workflow_to_task WHERE workflow_id = ?
若流程为“终止”状态,则删除队列中的信息,方法直接返回
com.netflix.conductor.dao.QueueDAO#remove
DELETE FROM queue_message WHERE queue_name = ? AND message_id = ?
2.2 查询任务信息:
com.netflix.conductor.core.dal.ExecutionDAOFacade#getTaskModel
SELECT json_data FROM task WHERE task_id = ?
若任务为“终止”状态,则删除队列中的信息,方法直接返回
com.netflix.conductor.dao.QueueDAO#remove
2.3 更新task的数据
- 若任务不是系统任务,且任务结果TaskResult为“IN_PROGRESS”,则将任务设置为“SCHEDULED” 状态
- 其它情况,将任务设置为TaskResult的状态
之后,将其它信息更新至task对象;
调用接口 com.netflix.conductor.core.dal.ExecutionDAOFacade#updateTask 将数据回写至库中
方法:com.netflix.conductor.mysql.dao.MySQLExecutionDAO#insertOrUpdateTaskData
数据存在则更新:UPDATE task SET json_data=?, modified_on=CURRENT_TIMESTAMP WHERE task_id=?
数据不存在则插入:INSERT INTO task (task_id, json_data, modified_on) VALUES (?, ?, CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE json_data=VALUES(json_data), modified_on=VALUES(modified_on)
若任务状态为“终止态”
方法:com.netflix.conductor.mysql.dao.MySQLExecutionDAO#insertOrUpdateTaskData
DELETE FROM task_in_progress WHERE task_def_name = ? AND task_id = ?
更新表 workflow_to_task 中的任务状态
方法:com.netflix.conductor.mysql.dao.MySQLExecutionDAO#addWorkflowToTaskMapping
INSERT IGNORE INTO workflow_to_task (workflow_id, task_id) VALUES (?, ?)
2.4 根据task的状态更新queue中信息
若状态为“TIMED_OUT”,则删除queue中的信息: com.netflix.conductor.dao.QueueDAO#remove
若状态为“SCHEDULED”,则推迟队列中的消息:com.netflix.conductor.dao.QueueDAO#postpone
2.5 更新流程数据
com.netflix.conductor.core.execution.WorkflowExecutor#isLazyEvaluateWorkflow
以下3中情况被判定为可延迟计算:
- 当前任务不是DO-WHILE类型的任务
- 当前任务属于FORK-JOIN中的分支中的任务
- 当前任务属于FORK_JOIN_DYNAMIC分支中的任务
2.5.2 若延迟计算则…
com.netflix.conductor.core.execution.WorkflowExecutor#expediteLazyWorkflowEvaluation
将workId插入到 decider queue 中
com.netflix.conductor.dao.QueueDAO#postpone
com.netflix.conductor.mysql.dao.MySQLQueueDAO#pushMessage
2.5.3 若不能延迟计算则…
com.netflix.conductor.core.execution.WorkflowExecutor#decide(java.lang.String)
查询流程信息: com.netflix.conductor.dao.ExecutionDAO#getWorkflow(java.lang.String, boolean)
SELECT json_data FROM workflow WHERE workflow_id = ?