1. 概述
假设有如下流程:
我们在流程进行的时候, 需要在申请和经理审批之间临时新增一个节点, 达到如下的效果:
该行为我们称之为加签.
加签的两种思路
- 直接修改模板, 在模板中添加节点以及连线, 并修改实例的走向;
- 直接修改流程定义对应的缓存数据, 不修改模板, 新增的节点与当前需要加签的实例挂钩.
2. 实现方式
2.1. 修改模板
步骤:
- 找到当前实例对象对应的模板数据;
- 在模板数据的基础上添加新节点, 修改连线, 并更新数据库中的模板;
- 更新模板对应的流程定义缓存, 否则加签节点不会生效;
- 完成新增的节点任务后, 再把新增的节点以及连线删除, 即还原流程模板.
- 模板是共享的, 所以把模板修改了, 所有运行实例对应的模板也会被修改;
- 修改模板容易导致当前实例影响到其他实例, 这种方法并不可取;
2.2 修改流程定义缓存
因为模板是共享的, 不修改模板就不会影响其他实例;
也不需要修改原有流程的流向, 要让流程按照新的流向运行.
因为流程在运转过程中, 需要实时获取该实例对应的模板数据才能知道应该如何流转
- 首先从流程定义缓存中获取模板数据;
- 如果流程缓存定义丢失, 则需要重新执行模板的解析工作并将其防止到流程缓存中;
因此修改流程定义缓存就可以实现功能.
但仍有一个问题需要解决: 如果流程定义缓存丢失, 引擎默认解析的是数据库中存在的模板数据, 而新增的临时节点不会存在与 XML 中.
2.2.1 步骤
- 在流程缓存中添加一个任务节点并为任务节点添加出线信息, 出线信息是需要到达的目标节点;
- 添加的目标节点并没有入线, 也就是说不会影响到其他的实例, 正常的流程实例启动的时候不会走到这个节点;
- 加签完成后可以触发执行实例走到新增的任务节点, 这样当前实例就按照最新的路线进行运转;
- 如果当前的节点加签后不想让实例运转到最新的节点, 可以复制一个当前节点, 继续让实例运转;
- 加签的最终目的是让实例按照最新的路线走, 与模板中规划的路线脱离关系.
需要解决的问题:
- 新增的节点以及连线如何存储;
- 流程定义缓存如何修改;
- 加签的节点以及连线信息如何持久化;
- 缓存丢失, 新的路线图丢失;
- 流程实例结束, 当前加签的节点以及连线已经不需要应该如何删除;
修改流程定义缓存后, 由于缓存失效, 依然会报错
此时就需要先添加缓存, 然后完成任务
3. 加签原理代码讲解
4. 加签节点存储表设计
Activiti 继承了 MyBatis 框架, 因此可以让我们注入配置文件或者注解类使用 MyBatis.