本篇我们主要是简单介绍工作流相关知识,如果学习flowable原理请直接到:XXXXXX
之前工作中未接触到工作流相关知识,最近项目中用到工作流系统(flowable框架),借此机会深入学习下flowable(由于项目中使用的是工作流(决策流和案例流有机会再介绍),因此以工作流模型为例,框架使用的是flowable)。
1、概述
Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准)。flowable可以创建这些流程定义的流程实例,并进行查询、访问运行中或历史的流程实例与相关数据。
1.1、为什么要用工作流
在日常生活工作中,或多或少都会遇见审批流程类型的业务需求。比如休假申请(开始->提交申请->领导审批->驳回/通过->结束),当没有工作流时我们需要定义不同的字段来标识各个阶段含义,当审批是多级或者动态时无法通过增加字段来解决问题(当然,通过暴力增加字段也是可行),为了解决上述硬编码实现审批流程而导致成本高,不利用维护的缺点,工作流因此而生。
1.2、什么是工作流
工作流,是把业务之间的各个步骤以及规则进行抽象和概括性的描述。使用特定的语言为业务流程建模,让其运行在计算机上,并根据用户的行为让计算机进行计算和推动。
工作流解决的痛点在于,解除业务宏观流程和微观逻辑的耦合,让熟悉宏观业务流程的人去制定整套流转逻辑,而让专业的人只需要关心他们应当关心的流程节点。
1.3、框架对比

1.4、模型语言支持
1.4.1、BPMN(Bussiness Process Model Notation)
BPMN(业务流程管理和符号,简称:工作流)是一种流行的业务流程建模语言。它是为业务流程建模而设计的,用于支持业务流程管理,包括分析、设计、优化和实施。通过提供易于理解的、视觉化的图形表示法,使得非技术性的业务人员也能很好地理解业务过程。
1.4.2、CMMN(Case Management Model Notation)
CMMN(案例管理模型和符号)是一种图形化表示法,用于建模和管理复杂、动态和不可预见的业务流程。与BPMN侧重于定义结构化、可预测的流程不同,CMMN专注于灵活和非结构化的工作流程,通常这些流程需要根据具体情况动态调整。
1.4.3、DMN(Decision Model and Notation)
DMN(决策模型标记, 简称:决策流)是一种标准化的图形表示法,用于描述和建模业务决策。DMN的目标是使业务分析师和技术开发者能够协作定义和管理业务规则和决策逻辑,确保决策过程透明、可理解和可执行。
官网:docs.camunda.org/manual/7.22...
2、简介
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。
2.1、基础概念
我们从流程定义和框架组成部分来初步认识flowable。
2.1.1、BPMN2.0流程定义
flowable目前大都使用BPMN2.0协议作为流程定义的标准,因此学习下协议的常用组成元素:
2.2、组成部分
我们可以从两个方面来认识 flowable 的组成。其一,底层数据表。深入了解底层数据表能够让我们迅速把握 flowable 的基础架构。其二,框架提供的核心 API。借助核心 API,我们能够快速洞悉 flowable 的核心能力。
2.2.1、数据表
表分类 | 表名 | 解释 |
---|---|---|
流程历史记录 | ||
ACT_HI_ACTINST | 历史的流程实例 | |
ACT_HI_ATTACHMENT | 历史的流程附件 | |
ACT_HI_COMMENT | 历史的说明性信息 | |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 | |
ACT_HI_ENTITYLINK | 历史参与的人员表 | |
ACT_HI_IDENTITYLINK | 历史的流程运行过程中用户关系 | |
ACT_HI_PROCINST | 历史的流程实例 | |
ACT_HI_TASKINST | 历史的任务实例 | |
ACT_HI_VARINST | 历史的流程运行中的变量信息 | |
用户用户组表 | ||
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 | 记录用户的token信息 | |
ACT_ID_USER | 用户表 | |
流程定义表 | ||
ACT_RE_DEPLOYMENT | 部署单元信息 | |
ACT_RE_MODEL | 模型信息 | |
ACT_RE_PROCDEF | 已部署的流程定义 | |
运行实例表 | ||
ACT_RU_ACTINST | act_ru_actinst相比于act_ru_taskinst数据更全一些,为记录工作流中的所有活动(包括开始、任务、结束等) | |
ACT_RU_EVENT_SUBSCR | 运行时事件 | |
ACT_RU_EXECUTION | 运行时流程执行实例 | |
ACT_RU_IDENTITYLINK | 运行时用户关系信息,存储任务节点与参与者的相关信息 | |
ACT_RU_ENTITYLINK | 存储实例的父子关系的信息 | |
ACT_RU_JOB | 运行时作业 | |
ACT_RU_TIMER_JOB | 定时作业表 | |
ACT_RU_SUSPENDED_JOB | 运行时暂停作业 | |
ACT_RU_EXTERNAL_JOB | 异步作业表(Flowable 引擎使用作业表来实现异步逻辑、计时器或历史处理) | |
ACT_RU_HISTORY_JOB | 当前流程所有历史执行的任务,但是因为如果流程结束,就查不到这些任务所以虽然是历史,但是也命名成了act_ru。 | |
ACT_RU_DEADLETTER_JOB | 运行时挂起作业 | |
ACT_RU_TASK | 运行时任务 | |
ACT_RU_VARIABLE | 运行时变量表 | |
表单 | ||
ACT_FO_FORM_DEFINITION | 表单定义表 | |
ACT_FO_FORM_DEPLOYMENT | 表单部署表 | |
ACT_FO_FORM_INSTANCE | 表单实例表 | |
ACT_FO_FORM_RESOURCE | 表单源数据表 | |
引擎存储和应用部署 | ||
ACT_APP_APPDEF | 应用程序定义 | |
ACT_APP_DEPLOYMENT | 应用程序部署信息 | |
ACT_APP_DEPLOYMENT_RESOURCE | 应用程序部署资源 | |
一般数据 | ||
ACT_GE_BYTEARRAY | 通用的流程定义和流程资源(二进制格式) | |
ACT_GE_PROPERTY | 系统相关属性 | |
CMMN相关 | ||
ACT_CMMN_CASEDEF | CMMN的定义 | |
ACT_CMMN_DEPLOYMENT | CMMN的部署 | |
ACT_CMMN_DEPLOYMENT_RESOURCE | CMMN相关资源 | |
ACT_CMMN_HI_CASE_INST | CMMN引擎启动的实例 | |
ACT_CMMN_HI_MIL_INST | 每个里程碑的数据 | |
ACT_CMMN_HI_PLAN_ITEM_INST | 计划项的数据 | |
ACT_CMMN_RU_CASE_INST | 已启动但尚未完成的实例的条目 | |
ACT_CMMN_RU_MIL_INST | 实例的一部分达到的每个里程碑的条目 | |
ACT_CMMN_RU_PLAN_ITEM_INST | 实例执行期间创建的每个实例的条目 | |
ACT_CMMN_RU_SENTRY_PART_INST | 存储哨兵 | |
DMN相关 | ||
ACT_DMN_DEPLOYMENT | DMN的部署表 | |
ACT_DMN_DEPLOYMENT_RESOURCE | DMN的资源表 | |
ACT_DMN_DECISION | 已部署决策表的元数据,来自其他引擎的定义相对应 | |
ACT_DMN_HI_DECISION_EXECUTION | 有关 DMN 决策表执行的审计信息 |
2.2.2、框架api
这是flowable官网的核心api
核心api | 名称 | 介绍 |
---|---|---|
ProcessEngine | 流程引擎 | ProcessEngine可以使用多种方式创建。使用ProcessEngine,可以获得各种提供工作流/BPM方法的服务。ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。 |
RuntimeService | 流程运行服务 | 用于启动流程定义的新流程实例,也用于读取与存储流程变量,还可以用于查询流程实例与执行(Execution)。最后,还可以在流程实例等待外部触发时使用RuntimeService,使流程可以继续运行 |
RepositoryService | 存储服务 | 这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作 |
TaskService | 任务服务 | 所有任务相关的东西都组织在TaskService中(转签、完成、拒绝等) |
ManagementService | 管理服务 | 通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。Flowable中很多地方都使用作业,例如定时器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed suspension/activation)等等 |
IdentityService | 用户组管理服务 | 它用于管理(创建,更新,删除,查询......)组与用户 |
HistoryService | 历史服务 | 当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。 |
FormService | 表单服务 | 这个服务引入了开始表单(start form)与任务表单(task form)的概念,我们可以在流程实例流转期间动态获取数据 |
DynamicBpmnService | 动态修改流程定义服务 | 可用于修改流程定义中的部分内容,而不需要重新部署它 |
3、使用指导

3.1、流程设计及部署
流程设计有两种方式
- 一种是使用IDEA插件画好后导出bpmn文件到指定目录,服务启动时自动加载。
- 一种是使用flowable自带的flowable-ui项目,但需要自己部署。
3.1.1、flowable-ui
因为saas化项目中,用户自定义流程时肯定需要flowable-ui,因此我们使用flowable-ui(其实项目中使用的wflow,是升级版flowable-ui,但底层核心逻辑还是flowable-ui)。
1.下载地址(自行选择版本,这里使用的是6.7.2)
github.com/flowable/fl...
2.解压
解压之后会获取到flowable-rest.war和flowable-ui.war(修改数据库,修改每个应用WEB-INF/classes/文件夹下的application.properties)
3.部署
将上述两个war包部署到Tomcat的webapps目录下,启动Tomcat
4.访问
通过页面设计流程并部署 访问地址:http://localhost:8080/flowable-ui
3.2、流程操作相关
项目中使用的springboot,因此直接引入starter包。
1.引入maven坐标
xml
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.7.2</version>
</dependency>
2.代码开发

可根据自己定义的变量(通过、拒绝)进行相关逻辑操作
在处理任务时,我们可能需要流程实例的参数或者当前任务的参数,我们可以通过RuntimeService、TaskService等api参数获取流程或任务的上下文数据,进而进行一些逻辑操作。(几乎我们想要的数据都可以拿到)
3.验证
使用POSTMAN 调用接口进行发起流程

在【act_ru_actinst】中添加了两条记录
在【act_ru_task】中添加了一条正在运行的记录

使用POSTMAN处理申请人节点自动通过,才会流转到审批人
使用POSTMAN 模拟老板审批=
流程结束后【act_hi_procinst】有一条完整的历史记录,这里面有开始时间、结束时间、时长等信息
上面流程中展示了常用作业务逻辑处理的几张表,其他表里面的数据也会随着流程的变化而变化,这里不再具体细讲,具体处理逻辑需要结合自己的业务场景。
4、总结
flowable是一个比较经典的框架,非常值得我们学习研究,大部分的业务审批、业务流转等流程基础都是使用flowable。通过简单的示例,认识flowable相关表及相关字段,为后续的深入研究打一个基础。