🐬查询编辑删除
- 查询
- 编辑:工作流实例可以编辑工作流,保存的时候有个是否更新工作流定义,感觉就是为了方便测试,不断修改测试没问题了,勾选更新工作流,实现工作流定义更新,工作流定义无需频繁上下线(只有下线可以修改)
🐠删除
从页面看删除工作流实例,会把对应的任务实例也删除掉。删除、批量删除对应两个方法,底层调用的还是同一个方法,分开的原因时批量删除删除失败需要弹出提示,有哪些实例删除失败
撇了一眼代码发现删除做了不少事情,有一部分感觉还是重复的,其实是针对子流程的,先造数据看一下:
定义子流程:
parentA内定义了两个子节点a1、a2:
运行parentA,查看任务实例,如下:
🐟数据结构
查看数据库(删除表数据不在赘述,删除日志后面可以看一下):
- 流程实例表
t_ds_process_instance
产生了三条记录,其中两条是子流程,页面不显示
- 流程实例关系表
t_ds_relation_process_instance
存放的数据用于处理流程定义中含有子流程的情况:- 字段
parent_process_instance_id
表示含有子流程的主流程实例id - 字段
process_instance_i
d表示子流程实例的id - 字段
parent_task_instance_id
表示子流程节点的任务实例id
- 字段
- 任务实例表
t_ds_task_instance
,主要就是增加对SUB_PROCESS
类型的删除
🐟删除源码Netty
-
删除日志
- 页面删除
shell3-2-20221011180000686
实例后,查看日志是否存在,如下图,日志已删除
- 发送删除日志指令
- 服务端读取处理指令
- 日志请求处理
LoggerRequestProcessor
- 页面删除
🐬执行(重跑、停止、失败重跑等)
REPEAT_RUNNING
重跑:新增指令RECOVER_SUSPENDED_PROCESS
恢复暂停:新增指令START_FAILURE_TASK_PROCESS
重跑失败任务(2.0叫恢复失败,即从失败节点开始跑):新增指令STOP
停止:先更新为准备停止状态,然后同删除日志,通过netty传送指令PAUSE
暂停:先更新为准备暂停状态,然后同删除日志,通过netty传送指令
🐠构建流程实例
其中重跑、恢复失败、恢复暂停是在登记流程实例表的时候做的判断ProcessServiceImpl.constructProcessInstance()
StartNodeIdList
用法见下面:
🐟右键节点运行
算是漏掉的工作流定义中的功能,主要还是3.0bug太多,之前点击运行,看到没有节点执行栏位了,当时想的是可能默认成只执行当前节点了,现在看来不是
本地启动前端登录,查看如下:
虚拟机地址访问如下:
🐡StartNodeIdList
回到主题上,节点右键运行会给参数
StartNodeIdList
传入当前任务节点编码。顾名思义,以该节点作为起始节点,查询关系表,组装DAG,进行向前、向后、只执行该节点操作。
上面的恢复失败和恢复暂停复用的就是这一块逻辑,将失败或暂停的节点编码作为StartNodeIdList
> ,执行向后执行操作。
目前遇到的StartNodeIdList
其实就只有一个节点,不知道为什么定义成list。
🐠停止、暂停
定义一个shell任务,等待sleep 10
10秒结束,停止功能是可以的,暂停无效,暂停会等任务执行完
暂停的情况下,后面可能还需要继续执行,所有要等当前正在执行的任务跑完之后(保证数据完整性),暂停执行后续的节点,增加任务节点,再次验证
暂停成功
恢复运行
🐟源码
更新准备状态:
同删除日志,可以找到处理状态事件的类StateEventProcessor
:
又回到了worker执行器这里:
StateEventType type = stateEvent.getTaskInstanceId() == 0 ? StateEventType.PROCESS_STATE_CHANGE : StateEventType.TASK_STATE_CHANGE;
没看到给TaskInstanceId
赋值的地方,StateEventType
应该为PROCESS_STATE_CHANGE
,对应WorkflowStateEventHandler
处理类,如下:
暂停就是当前节点跑完之后,流程状态更新为暂停,和停止的唯一区别就是当前节点跑完:
看到一句注释:todo不是后面要做的事情嘛?不过看现象已经实现了,按照注释说的暂停任务不放到completeTaskMap
,当只有一个节点的时候processReadyPause()
方法返回ExecutionStatus.SUCCESS
,而当多个节点时,虽然pauseList
依然为空,但是整个流程还没结束,因此返回ExecutionStatus.PAUSE
if (CollectionUtils.isNotEmpty(pauseList) || processInstance.isBlocked() || !isComplementEnd() || readyToSubmitTaskQueue.size() > 0
最后给大家分享一段代码,保证认识字的人都能看懂:
if("写的还凑合"){
"请右下角点👍"
} else if("写的不错") {
"请右下角点⭐收藏,没事就可以回味回味!"
} else {
"请右下角点💬,接受夸赞,反对批评!"
"当然有问题,热烈🌞欢迎🎈指正🙇♂️!"
}