没有合适的资源?快使用搜索试试~ 我知道了~
Activiti(Flowable) 流程实例克隆解决方案1
需积分: 0 1 下载量 127 浏览量
2022-08-08
21:12:05
上传
评论
收藏 45KB DOCX 举报
温馨提示
试读
25页
Activiti(Flowable) 流程实例克隆解决方案1
资源详情
资源评论
资源推荐
Activiti(Flowable)流程克隆(运行时实例克隆)解决方案
一种订单制造中分裂与合并的核心技术实践
作者:长沙大东家 xiaohelong2005@126.com 2017-11-24 20:24 长沙
20180425 完善性更新
1. 背景
订单可视化系统是单位的一套基于业务流程引擎技术的智能制
造信息系统,在公司领导的战略部署下,完全自主开发的一套适用于
多品种、小批量订单式制造型企业。系统以对订单的全生命周期进行
管控。通过对订单的售前、生产、售后及过程中产生的异常等进行记
录并分析。再以此为基础,对各个业务环节逐步细化,由于是对一个
企业进行全方位流程再造,涉及到企业所有方面,持续时间较长,并
且随着企业的发展而发展的一套系统。
在对流程引擎技术选择中,我们选择了 Activiti(现在作者重新
Fok 出叫 Flowable 的项目),开源、稳定,社区活跃。但外国人开发
的流程系统并没有考虑到中国的实际使用情况,如驳回、任意跳转等。
更不用说会想到中国制造型企业的特色流程需求,如订单随时分裂与
合并。
2. 问题提出
订单在流程的执行过程中,企业中会在所有可能的环节出现订单
分裂的需求。如因为采购的物料只来的一部分,客户同意先提走一部
分;客户在设计环节或制造前突然取消几套设备都有可能;即使在机
器制造完毕后,还有可能分不同批次发送,补生产之类。Activiti 并
不支持理想中类似于管道中跑包裹的情况,对,最理想的方式就是隧
道中跑小汽车的模式,每一台设备每一个一个编号,再对编号进行分
组成一个订单便可以解决这个问题。但 Activiti 很明显不支持这种模
式,自己开发一个框架时间和成熟度上也不合适。只能在 activiti 基
础上进行。
临时的解决方案便是将原来的流程挂起,再新开几个对应的流程,
再跳转至原来的任务节点。这么做临时性解决了一些问题,但也带来
了两个实际的问题:一、新的流程并没有携带以前的历史信息;二、
跳转只能单线,当有并行多线路时,则只能跳到原来的一根线上,其
它的线会断层。所以克隆是从最初至现在一直想要的实施方案,克隆
可以完整地解决这些问题,订单拆分时可以克隆多份并配套至业务订
单即可。因为时间与技术的熟悉程度,所以用了一点时间研究了
Activiti 机制,决定从直接更改数据库中的数据为总体思路。即将该
流程所有信息复制一问,换用新的 ID。
为什么要自己做呢?因数无论是哪里都找不到资料,只能靠自己
来解决此事。
3. 第一次试错
在起初实施的时侯,我试图通过表之间的关系、字段之间的关系,
逐层逐表进行替换。但在逐步的深入中,子流程、并行、递归及相互
字段的更新等导致逻辑越来越复杂,最终不得不放弃此种实施思路。
4. 最终思路
在某一个瞬间,来了一个灵感,想到以前在做网页时全局将
UUID 替换成指定单词的经验,我们在 Java 代码中应用这种全局文
本替换结合 UUID 的唯一性与特殊性,最终思路便是将该流程实例的
所有信息全部读入,将每一个 ID 列入一个集合中,再配套分配一个
新的 ID 反向存入数据,得以解决,逻辑思路上也很解单。
研究与实践就是研究需要试错 10 次,100 次才能找到正确的一
次方式。
具体思路如下:
1. 首先读取所有流程相关的记录,只要处理 act_hi_*,act_ru_*,
act__ge_bytearray。
2. 将所有 id 字段 读 入 ( 有 一 些 id 字 段 要 排 除 , 如 procDefId,
bytearrayId)集合,如果是初次进入集合给定一个对应的新 id,如
果是已存在,则直接从集合中读取该 id 放入此记录中。
3. 读取完毕后,直接用新 id 替换对应的数据。
4. 批量存入数据库,流程克隆完成。(在 insert 时,act_ru_*的需要
临时将数据库外键关闭)
5. 检测是否执行完毕,结束
对于子流程,进行递归调用处理。对于程序中没有克隆的表,大
家参照这个思路进行添加处理,因为目前这些对我们够用了。
6. 其它
将 act_ru_variable 中对 act_ge_bytearray 中的外键进行修改,
防止更新出错。删除时 set null,更新时 set null。
5. 最佳实践
5.1. Activiti(Flowable)5.21 的数据表(Mysql and mybatis)基础
(重点关注 act_hi_*,act_ru_*的中 id 相关字段)
5.1.1. 基础说明
参考地址(reference):http://lucaslz.com/2016/11/15/java/activiti/activiti-db-5-22/
ACT_RU_*:‘RU’表示 runtime,运行时表-RuntimeService。这是运行时的表存储着流
程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的
运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
ACT_HI_*:
’HI’表示 history,历史数据表,HistoryService。就是这些表包含着流程执行的历史相
关数据,如结束的流程实例,变量,任务,等等
5.1.2. 表摘要
ACT_HI_ACTINST 历史节点表
ACT_HI_ATTACHMENT 历史附件表
ACT_HI_COMMENT 历史意见表
ACT_HI_DETAIL 历史详情表,提供历史变量的查询
ACT_HI_IDENTITYLINK 历史流程人员表
ACT_HI_PROCINST 历史流程实例表
ACT_HI_TASKINST 历史流程任务表
ACT_HI_VARINST 历史变量表
ACT_RU_EVENT_SUBSCR throwEvent、catchEvent 时间监听信息表
ACT_RU_EXECUTION 运行时流程执行实例表
ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者相关信息
ACT_RU_JOB 运行时定时任务数据表
ACT_RU_TASK 运行时任务节点表
ACT_RU_VARIABLE 运行时流程变量数据表
5.1.3. 表结构说明(关键 ID 字段加粗,要包括本身的 ID_号)
5.1.3.1.ACT_HI_ACTINST(历史节点表)
历史活动信息。这里记录流程流转过的所有节点,与 HI_TASKINST 不同的是,taskinst 只记
录 usertask 内容。
表结构说明
字段名称 描述 数据类型 Nullable 取值说明
ID_ 主键 varchar(64) NO 主键 ID
PROC_DEF_ID_ 流程定义 ID varchar(64) NO 流程定义 ID
PROC_INST_ID_ 流程实例 ID varchar(64) NO 流程实例 ID
EXECUTION_ID_ 执行实例 ID varchar(64) NO 执行实例 ID
ACT_ID_ 节点 ID varchar(255) NO 节点定义 ID
TASK_ID_ 节点实例 ID varchar(64) YES 默认值 NULL,其他节点类型实例 ID 在这里
为空
CALL_PROC_INST_ID_ 调用外部的流程实例 ID varchar(64) YES 默认值 NULL,调用外
部流程的流程实例 ID
ACT_NAME_ 节点名称 varchar(255) YES 默认值 NULL,节点定义名称
ACT_TYPE_ 节点类型 varchar(255) NO 如 startEvent、userTask
ASSIGNEE_ 签收人 varchar(255) YES 默认值 NULL,节点签收人
START_TIME_ 开始时间 datetime(3) NO version 版本,2016-11-15 11:30:00
END_TIME_ 结束时间 datetime(3) NO 默认值 NULL,2016-11-15 11:30:00
DURATION_ 耗时 bigint(20) YES 默认值 NULL,毫秒值
TENANT_ID_ 租户标识 varchar(255) YES 默认值``,
5.1.3.2.ACT_HI_ATTACHMENT(历史附件表)
历史附件表。
表结构说明
字段名称 描述 数据类型 Nullable 取值说明
ID_ 主键 varchar(64) NO 主键 ID
REV_ 乐观锁 int(11) YES 默认值 NULL,version 版本
剩余24页未读,继续阅读
尹子先生
- 粉丝: 18
- 资源: 324
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0