Fork me on GitHub

Activiti(6)--加签功能的实现

1. 概述

假设有如下流程:

image

我们在流程进行的时候, 需要在申请和经理审批之间临时新增一个节点, 达到如下的效果:

image

该行为我们称之为加签.

加签的两种思路

  1. 直接修改模板, 在模板中添加节点以及连线, 并修改实例的走向;
  2. 直接修改流程定义对应的缓存数据, 不修改模板, 新增的节点与当前需要加签的实例挂钩.

2. 实现方式

2.1. 修改模板

步骤:

  1. 找到当前实例对象对应的模板数据;
  2. 在模板数据的基础上添加新节点, 修改连线, 并更新数据库中的模板;
  3. 更新模板对应的流程定义缓存, 否则加签节点不会生效;
  4. 完成新增的节点任务后, 再把新增的节点以及连线删除, 即还原流程模板.
  • 模板是共享的, 所以把模板修改了, 所有运行实例对应的模板也会被修改;
  • 修改模板容易导致当前实例影响到其他实例, 这种方法并不可取;

2.2 修改流程定义缓存

因为模板是共享的, 不修改模板就不会影响其他实例;

也不需要修改原有流程的流向, 要让流程按照新的流向运行.

因为流程在运转过程中, 需要实时获取该实例对应的模板数据才能知道应该如何流转

  1. 首先从流程定义缓存中获取模板数据;
  2. 如果流程缓存定义丢失, 则需要重新执行模板的解析工作并将其防止到流程缓存中;

因此修改流程定义缓存就可以实现功能.

但仍有一个问题需要解决: 如果流程定义缓存丢失, 引擎默认解析的是数据库中存在的模板数据, 而新增的临时节点不会存在与 XML 中.

2.2.1 步骤

image

  1. 在流程缓存中添加一个任务节点并为任务节点添加出线信息, 出线信息是需要到达的目标节点;
  2. 添加的目标节点并没有入线, 也就是说不会影响到其他的实例, 正常的流程实例启动的时候不会走到这个节点;
  3. 加签完成后可以触发执行实例走到新增的任务节点, 这样当前实例就按照最新的路线进行运转;
  4. 如果当前的节点加签后不想让实例运转到最新的节点, 可以复制一个当前节点, 继续让实例运转;
  5. 加签的最终目的是让实例按照最新的路线走, 与模板中规划的路线脱离关系.

需要解决的问题:

  1. 新增的节点以及连线如何存储;
  2. 流程定义缓存如何修改;
  3. 加签的节点以及连线信息如何持久化;
  4. 缓存丢失, 新的路线图丢失;
  5. 流程实例结束, 当前加签的节点以及连线已经不需要应该如何删除;

修改流程定义缓存后, 由于缓存失效, 依然会报错

此时就需要先添加缓存, 然后完成任务

3. 加签原理代码讲解

4. 加签节点存储表设计

Activiti 继承了 MyBatis 框架, 因此可以让我们注入配置文件或者注解类使用 MyBatis.

4.1. 表结构

4.2. 实体类

4.3. Mapper 类

4.4. 注入流程引擎

>