Flowable工作流引擎
作者:毫末科技
邮箱:hxg@haomo-studio.com
1 概述
Flowable,2016年基于Activiti诞生。Flowable是Activiti原班主创人员从Activiti分离出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。
Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。这个章节将用一个可以在你自己的开发环境中使用的例子,逐步介绍各种概念与API。
Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。 以JAR形式发布使Flowable可以轻易加入任何Java环境:Java SE;Tomcat、Jetty或Spring之类的servlet容器;JBoss或WebSphere之类的Java EE服务器,等等。 另外,也可以使用Flowable REST API进行HTTP调用。也有许多Flowable应用(Flowable Modeler, Flowable Admin, Flowable IDM 与 Flowable Task),提供了直接可用的UI示例,可以使用流程与任务。
所有使用Flowable方法的共同点是核心引擎。核心引擎是一组服务的集合,并提供管理与执行业务流程的API。
以下对Flowable进行简要说明:
- 是一款轻量级的流程引擎,以java语言编写
- 支持BPMN2.0
- 非常灵活,可以方便的部署到以java编程的环境中去
- 多个应用开箱即用(Flowable Modeler, Flowable Admin, Flowable IDM and Flowable Task)
2 功能特性
- 异步处理历史数据
当前版本处理历史数据与运行时数据处在同一个线程,大量使用案例表明,处理历史数据占用较长时间而用户不得不等待该线程事务的结束。改为异步处理后性能明显得到改善。
- 回退功能
通过API方式,让工作流当前状态回滚到之前的状态。
- 增加和拓展对事件子流程的支持
- 提高对事件监听器事务生命周期的支持
- 新增全局Counter功能
Flowable是Activiti的衍生版本,相对于Activiti来说,它具有以下更加丰富的特性:
- flowable已经支持所有的历史数据使用mongdb存储,activiti没有。
- flowable支持事务子流程,activiti没有。
- flowable支持多实例加签、减签,activiti没有。
- flowable支持httpTask等新的类型节点,activiti没有。
- flowable支持在流程中动态添加任务节点,activiti没有。
- flowable支持历史任务数据通过消息中间件发送,activiti没有。
- flowable支持java11,activiti没有。
- flowable支持动态脚本,,activiti没有。
- flowable支持条件表达式中自定义juel函数,activiti没有。
- flowable支持cmmn规范,activiti没有。
- flowable修复了dmn规范设计器,activit用的dmn设计器还是旧的框架,bug太多。
- flowable屏蔽了pvm,activiti6也屏蔽了pvm(因为6版本官方提供了加签功能,发现pvm设计的过于臃肿,索性直接移除,这样加签实现起来更简洁、事实确实如此,如果需要获取节点、连线等信息可以使用bpmnmodel替代)。
- flowable与activiti提供了新的事务监听器。activiti5版本只有事件监听器、任务监听器、执行监听器。-
- flowable对activiti的代码大量的进行了重构。
- activiti以及flowable支持的数据库有h2、hsql、mysql、oracle、postgres、mssql、db2。其他数据库不支持的。
3 项目开发流程
3.1 需求分析
在工作流应用中,需要在需求层面梳理的最关键的几个方面如下:
- 组织结构
- 流程流转
- 流程表单
组织结构通常包括:
- 部门层级关系
- 角色设置
- 用户分组设置
- 用户
流程流转,需要梳理清楚:
- 有多少个流程节点
- 各节点间流转条件
流程表单,需要梳理清楚:
- 总共有哪些表单字段
- 各节点中每个表单字段的可见性、可编辑性和特殊交互
根据以上分析,通常可以用两个矩阵来梳理需求:
- 矩阵一:节点<->节点矩阵。示例如下:
流程矩阵 | 节点一 | 节点二 | 节点三 | 节点四 |
---|---|---|---|---|
节点一 | 无 | A领导审批 | B领导审批 | C领导审批 |
节点二 | 无 | |||
节点三 | 无 | |||
节点四 | C领导拒绝 | A伶道拒绝 | B领导拒绝 | 无 |
- 矩阵二:节点<->表单字段矩阵。示例如下:
字段交互矩阵 | 字段1 | 字段2 | 字段3 | 字段4 | 字段5 | 字段6 | 字段7 |
---|---|---|---|---|---|---|---|
节点一 | 可见 可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 |
节点二 | 可见 不可编辑 自动带出 | 可见 可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 |
节点三 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 |
节点四 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 | 可见 不可编辑 自动带出 |
3.2 流程设计
Flowable提供了可视化的流程设计页面,如下图所示:
流程图中支持丰富的节点元素,总结如下:
- 任务
- 用户任务
- 脚本任务
- Java服务任务
- Web服务任务
- 业务规则任务
- 邮件任务
- Http任务
- Mule任务
- Camel任务
- 手动任务
- Java接收任务
- Shell任务
- 执行监听器
- 任务监听器
- 多实例(for each)
- 补偿处理器
- 事件
- 启动事件
- 空启动事件
- 定时器启动事件
- 消息启动事件
- 信号启动事件
- 错误启动事件
- 结束事件
- 空结束事件
- 错误结束事件
- 终止结束事件
- 取消结束事件
- 边界事件
- 定时器边界事件
- 错误边界事件
- 信号边界事件
- 消息边界事件
- 取消边界事件
- 补偿边界事件
- 捕获中间事件
- 定时器捕获中间事件
- 信号捕获中间事件
- 消息捕获中间事件
- 抛出中间事件
- 空抛出中间事件
- 信号抛出中间事件
- 补偿抛出中间事件
- 网关
- 排他网关
- 并行网关
- 包容网关
- 基于事件的网关
3.3 组织结构同步
Flowable默认提供了一套自己的权限管理接口(IDM),但是从Flowable 6开始,IDM的组件被独立出来,分为几个不同的模块:flowable-idm-api, flowable-idm-engine, flowable-idm-spring 和 flowable-idm-engine-configurator。
Flowable用到的权限相关的表:
- ACT_ID_USER 存储的用户,调用saveUser接口会存储在里面
- ACT_ID_INFO 存储用户的属性信息,setUserInfo接口的时候设置一key,value信息存储在其中
- ACT_ID_GROUP 存储新创建的Flowable组信息,saveGroup会存储在其中
- ACT_ID_MEMBERSHIP 用户和组的关系会存在里面,用户和组可以多对多
- ACT_ID_PRIV 存储可以使用的权限,createPrivilege会新增一条记录
- ACT_ID_PRIV_MAPPING 存储用户id或组id与权限的映射关系,addGroupPrivilegeMapping或者addUserPrivilegeMapping会新增一台记录
- ACT_ID_TOKEN 用户相关Token,saveToken会新存储一条记录
3.4.1 自定义权限管理
默认的权限管理通常满足不了我们的需要,或者已经有自己的权限管理系统,则需要额外处理。有2种可以与自己业务兼容的方案:
- 方案一:同步自己的权限表信息,适配Flowable的表结构,仍然使用IDM提供的服务接口去操作
- 优点:对Flowable没有侵入性,不需要引入额外的内容
- 缺点:已经有权限管理系统的时候,如果存在两份数据可能有数据不一致的现象,增加额外的数据维护
- 方案二:自己写代码,实现IdmIdentityService接口,处理自己的权限管理逻辑。官方提供了可以直接使用的LDAP集成方案,我们不一定使用LDAP,但是其中的代码实现比较经典,可以参考一下。
- 优点:自定义实现,灵活,不管什么权限系统都可以写适配
- 缺点:如果其他组想接入Flowable,需要引入我们的权限控制实现。
3.4 表单设计
4 深入Flowable
4.1 表结构
flowable表命名规则:
- ACTRE* :’ RE ’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
- ACTRU* :’ RU ’表示runtime。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
- ACTID* : ’ ID ’表示identity(组织机构)。这些表包含标识的信息,如用户,用户组,等等。
- ACTHI* : ’ HI ’表示history。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。
- ACTGE* : 普通数据,各种情况都使用的数据。
表分类 | 表名 | 表说明 |
---|---|---|
一般数据(2) | ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 |
ACT_GE_PROPERTY | 系统相关属性 | |
流程历史记录(8) | ACT_HI_ACTINST | 历史的流程实例 |
ACT_HI_ATTACHMENT | 历史的流程附件 | |
ACT_HI_COMMENT | 历史的说明性信息 | |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 | |
ACT_HI_IDENTITYLINK | 历史的流程运行过程中用户关系 | |
ACT_HI_PROCINST | 历史的流程实例 | |
ACT_HI_TASKINST | 历史的任务实例 | |
ACT_HI_VARINST | 历史的流程运行中的变量信息 | |
用户用户组表(9) | ACT_ID_BYTEARRAY | 二进制数据表 |
ACT_ID_GROUP | 用户组信息表 | |
ACT_ID_INFO | 用户信息详情表 | |
ACT_ID_MEMBERSHIP | 人与组关系表 | |
ACT_ID_PRIV | 权限表 | |
ACT_ID_PRIV_MAPPING | 用户或组权限关系表 | |
ACT_ID_PROPERTY | 属性表 | |
ACT_ID_TOKEN | 系统登录日志表 | |
ACT_ID_USER | 用户表 | |
流程定义表(3) | ACT_RE_DEPLOYMENT | 部署单元信息 |
ACT_RE_MODEL | 模型信息 | |
ACT_RE_PROCDEF | 已部署的流程定义 | |
运行实例表(10) | ACT_RU_DEADLETTER_JOB | 正在运行的任务表 |
ACT_RU_EVENT_SUBSCR | 运行时事件 | |
ACT_RU_EXECUTION | 运行时流程执行实例 | |
ACT_RU_HISTORY_JOB | 历史作业表 | |
ACT_RU_IDENTITYLINK | 运行时用户关系信息 | |
ACT_RU_JOB | 运行时作业表 | |
ACT_RU_SUSPENDED_JOB | 暂停作业表 | |
ACT_RU_TASK | 运行时任务表 | |
ACT_RU_TIMER_JOB | 定时作业表 | |
ACT_RU_VARIABLE | 运行时变量表 | |
其他表(2) | ACT_EVT_LOG | 事件日志表 |
ACT_PROCDEF_INFO | 流程定义信息 |
特殊功能实现
驳回
说明一:协办是一种任务类型,本质上是任务,但这种任务的处理只有建议权而没有决策权,所以协办人员不能经行审批
说明二:审批要点属于审批的一部分。协办又不是审批自然看不到审批要点
转发
?应该是转办?
转交
变更
?
签收
flowable的办理方式,分为两种:签收模式办理和直接办理。
签收后办理模式: 任务建立后,流程进入一个等待状态,须要用户去签收任务,即接收任务的一个过程。原理就是它的执行实例表act_ru_execution建立了一条记录,但act_ru_task表中是没有建立这个记录,只有签收后act_ru_task才会生成一条任务记录。签收办理人,能够分为:候选人(一人或者多人,之间逗号分开)和候选用户组(一个或者多个组,之间逗号分开)。这种模式就是任务的抢占模式,谁先签收,这个任务就归谁。真实的任务其实只有一条,只是尚未在act_ru_task生成。
- 签收:一般情况就是多个候选人,或者候选组的情况下,要先把这个任务签收下来,以免别人又做了同样的任务。
反签收:就是把执行人设置为空
- flowable实战(十二)flowable 任务办理方式与办理人设置探讨
撤回
抄送
阅示
阅示(查看标记) : 被知会用户:查看过流程后,记录下来查看记录、时间
暂存
加签
会签
知会
工作流审批结束,可设置知会用户:可选择 角色、用户、用户组、岗位、部门、或是所有参与过审批的人
转办
传阅
作废
催办
收到待办后,超过规定时间未处理,发送邮件或短信催办,或默认自动通过;
可以对当前流程所有任务,或者指定节点的任务设置限时,如果任务逾期,则会对任务候选人周期发送催办消息。
也可以逾期后执行一些动态的脚本来干预流程,比如自动完成掉当前任务,终止掉流程实例等。