Flowable工作流引擎

官网:https://haomo-tech.com

作者:毫末科技

邮箱: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生成。

撤回

抄送

阅示

阅示(查看标记) : 被知会用户:查看过流程后,记录下来查看记录、时间

暂存

加签

会签

知会

工作流审批结束,可设置知会用户:可选择 角色、用户、用户组、岗位、部门、或是所有参与过审批的人

转办

传阅

作废

催办

收到待办后,超过规定时间未处理,发送邮件或短信催办,或默认自动通过;

可以对当前流程所有任务,或者指定节点的任务设置限时,如果任务逾期,则会对任务候选人周期发送催办消息。

也可以逾期后执行一些动态的脚本来干预流程,比如自动完成掉当前任务,终止掉流程实例等。

归档

重要库

参考

results matching ""

    No results matching ""