集成Activiti必须了解的内容

344 阅读4分钟

简介

目前选用的版本是 5.22.0, 入门 activiti 需要了解的内容:

1.bpmn 规范, activiti 提供的 Service , activiti 内置的表;

2.流程定义,流程部署,启动流程,流程查询,任务表单

3.重构用户组,动态分配任务,集成 modeler ,定时任务

推荐参考: 咖啡兔, 官网API

spring boot,mybatis,activiti

bpmn规范

bpmn 用于定义业务流程图, activiti 支持 bpmn2.0 规范,并加入了一些自定义的属性;

阅读 demo 中的 bpmn 文件即可大致了解;

流程与表之间的基本关联描述

1.deploy

流程部署成功后,打包上传的 bpmnpng 文件属于静态资源文件,保存在 act_ge_bytearray 中;

除了资源文件外,生成的部署信息和流程定义分别保存在 act_re_deploymentact_re_procdef 中;

2.model

流程的一种形式,以 model 形式保存流程,信息保存在表 act_re_model,act_ge_bytearray 中;

model 流程的部署同 bpmn 流程, 生成 bpmnpng 文件保存在 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_taskinstact_ru_task 表中;

6.变量

执行任务过程中产生的变量信息(也包含动态表单的信息)存储在 act_ru_variableact_hi_varinst 表中;

任务完成后,历史变量信息会被存储在 act_hi_detail 表中(该表存储哪些信息由配置中的 HistoryLevel 决定)

7.执行者

任务的执行者信息存储在 act_ru_identitylinkact_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.自定义 UserManagerFactoryGroupManagerFactory 实现 SessionFactory 接口

3.继承 activiti 定义的 UserEntityManagerGroupEntityManager , 重写主要方法

替换后可删除表 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);


注意 assigneecandidateGroups 的查询方式不同,故不能混用;

activiti modeler

activiti 提供的网页绘制工具,已集成至 demo 项目,参考博客;

定时任务

act_ru_job,尚未在demo中尝试运用

spring boot

采用注解取代xml配置项

配置文件application.yml

流程回退&撤销

需要自定义扩展

owner和assignee

指定办理人 > claim || setAssignee

发生委托,A委托给B

则 任务的办理人由A变成B 同时owner被赋值A