简介
目前选用的版本是 5.22.0, 入门 activiti 需要了解的内容:
1.bpmn 规范, activiti 提供的 Service , activiti 内置的表;
2.流程定义,流程部署,启动流程,流程查询,任务表单
3.重构用户组,动态分配任务,集成 modeler ,定时任务
spring boot,mybatis,activiti
bpmn规范
bpmn 用于定义业务流程图, activiti 支持 bpmn2.0 规范,并加入了一些自定义的属性;
阅读 demo 中的 bpmn 文件即可大致了解;
流程与表之间的基本关联描述
1.deploy
流程部署成功后,打包上传的 bpmn 和 png 文件属于静态资源文件,保存在 act_ge_bytearray 中;
除了资源文件外,生成的部署信息和流程定义分别保存在 act_re_deployment 和 act_re_procdef 中;
2.model
流程的一种形式,以 model 形式保存流程,信息保存在表 act_re_model,act_ge_bytearray 中;
model 流程的部署同 bpmn 流程, 生成 bpmn 和 png 文件保存在 act_ge_bytearray 中
3.processInstance
流程每次启动都会生成一个流程实例,保存在 act_hi_procint 表中, proc_inst_id_ 是流程实例的 id ;
4.execution
execution 指一个流程实例要执行的过程对象,保存在 act_ru_execution 表中;
execution 表的 id_ 字段通常与 proc_inst_id_ 字段一致,不一致时代表该 execution 是子流程;
5.task
流程图中的每个节点都是一个任务,上一个任务完成后,下一个任务就会被插入到 act_hi_taskinst 和 act_ru_task 表中;
6.变量
执行任务过程中产生的变量信息(也包含动态表单的信息)存储在 act_ru_variable 和 act_hi_varinst 表中;
任务完成后,历史变量信息会被存储在 act_hi_detail 表中(该表存储哪些信息由配置中的 HistoryLevel 决定)
7.执行者
任务的执行者信息存储在 act_ru_identitylink 和 act_hi_identitylink 表中;
activiti提供的Service
activiti 提供了如下七类接口便于部署、启动、执行、查询流程实例、任务及表单信息;
可参考 demo 项目和官方api;
| RepositoryService | 管理流程定义,查询、部署流程 |
| RuntimeService | 执行管理,包括启动、推进、删除流程实例等操作,查询正在运行的流程信息 |
| TaskService | 任务管理,如查询某个人的代办任务 |
| HistoryService | 历史数据管理 |
| IdentityService | 组织机构管理,查询activiti内置的用户组织结构信息 |
| FormService | 一个可选服务,任务表单管理,如查询动态表单属性值 |
| ManagementService | Service for admin and maintenance operations on the process engine. These operations will typically not be used in a workflow driven application, but are used in for example the operational console. |
流程内置的表
activiti 内置25张表,表字段详情参考
内置表以 ACT 开头,表名第二部分代表表的类型,如:
ACT_GE_* -> General, ACT_HI_* -> History, ACT_ID_* -> Identity, ACT_RE_ -> Repository, ACT_RU_* -> Runtime;
| 表分类 | 表名 | 解释 |
| 一般数据 | ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 |
| ACT_GE_PROPERTY | 系统相关属性 | |
| 流程历史记录 | 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_ID_GROUP | 身份信息-组信息 |
| ACT_ID_INFO | 身份信息-组信息 | |
| ACT_ID_MEMBERSHIP | 身份信息-用户和组关系的中间表 | |
| ACT_ID_USER | 身份信息-用户信息 | |
| 流程定义表 | ACT_RE_DEPLOYMENT | 部署单元信息 |
| ACT_RE_MODEL | 模型信息 | |
| ACT_RE_PROCDEF | 已部署的流程定义 | |
| 运行实例表 | ACT_RU_EVENT_SUBSCR | 运行时事件 |
| ACT_RU_EXECUTION | 运行时流程执行实例 | |
| ACT_RU_IDENTITYLINK | 运行时用户关系信息 | |
| ACT_RU_JOB | 运行时作业 | |
| ACT_RU_TASK | 运行时任务 | |
| ACT_RU_VARIABLE | 运行时变量表 |
表单
bpmn文件中有两种定义表单的方式:
1.动态表单
<userTask activiti:candidateGroups="emp" activiti:exclusive="true" id="usertask6" name="员工发起请假申请">
<extensionElements>
<activiti:formProperty datePattern="yyyy-MM-dd" id="startTime" name="开始时间" type="date"/>
<activiti:formProperty datePattern="yyyy-MM-dd" id="endTime" name="结束时间" type="date"/>
<activiti:formProperty id="restReason" name="请假原因" type="string"/>
</extensionElements>
</userTask>
可通过 formService 获取表单属性、赋值、提交并完成当前任务;
2.外置表单(普通表单)
<userTask activiti:candidateGroups="fz" activiti:exclusive="true" activiti:formKey="audit.jsp" id="usertask11" name="审批"/>
可通过 formService 获取 formKey 自行处理,formKey一般来说是路径+名称;
自定义用户组
activiti 内置了一套用户组以及认证管理,结构较为简单,不符合使用场景,需要替换为自定义用户组管理;
参考博客:重构用户组数据的多种方案比较
目前采用的是自定义 sessionFactory 的方式,即替换 activiti 原生的用户组查询模块,实现描述如下:
1.配置 activiti 使用自定义 sessionFactory
2.自定义 UserManagerFactory 和 GroupManagerFactory 实现 SessionFactory 接口
3.继承 activiti 定义的 UserEntityManager 和 GroupEntityManager , 重写主要方法
替换后可删除表 act_id_* ;
该方案在使用的时候需要避免调用未重写的方法;
任务的动态分配
任务的动态分配与指派有多种实现方式,适用于不同场景,按需选择;
1.实现 TaskListener 接口,如:
bpmn中的定义:
<userTask activiti:candidateGroups="2" activiti:exclusive="true" activiti:formKey="audit_bz.jsp" id="usertask7" name="项目组长审批">
<extensionElements>
<activiti:taskListener event="create" class="com.xxx.TaskListenerImpl"/>
</extensionElements>
</userTask>
TaskListenerImpl 的实现:
public class TaskListenerImpl implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
delegateTask.deleteCandidateGroup("manager");
delegateTask.addCandidateGroup("president");
}
}
2.直接指定办理人,如:
<userTask id="hrAudit" name="人事审批" activiti:assignee="${hrUserId}" />
任务完成后传递该变量;
Map variables = new HashMap();
variables.put("hrUserId", hrUserId);
taskService.complete(taskId, variables);
注意 assignee 与 candidateGroups 的查询方式不同,故不能混用;
activiti modeler
activiti 提供的网页绘制工具,已集成至 demo 项目,参考博客;
定时任务
act_ru_job,尚未在demo中尝试运用
spring boot
采用注解取代xml配置项
配置文件application.yml
流程回退&撤销
需要自定义扩展
owner和assignee
指定办理人 > claim || setAssignee
发生委托,A委托给B
则 任务的办理人由A变成B 同时owner被赋值A