概念
flowable用于实现工作流,即定义并推动一个流程按节点进行。
flowable中有如下概念:
- process definition:流程定义。即定义了流程由哪些组成。
- process instance:流程实例。流程定义实例化后的对象,即一个具体的流程。一个流程定义可多次实例化,从而生成多个实例,代表同时有多个同类流程在进行。流程实例的生命周期随流程启动创建,随流程结束销毁。
- execution:执行实例。表示流程实例中当前正在执行的具体路径或分支节点,是运行时指针。对于线性流程,1个流程实例有1个执行实例;对于并行分支流程,多个分支同步推进,每个分支都会生成一个独立的执行实例。因此,1个流程实例可能有n个执行实例。执行实例的生命周期在流程流转中动态创建和销毁(如分支开始时创建,分支结束时销毁)。
- task:流程任务/审批节点。一个执行实例包含多个节点,除了开始和结束,其中间的审批节点均使用task表示。 注意Task是关联到执行实例的,而非直接关联流程实例。
流程实例和执行实例,本质上都是Execution,都保存在ACT_RU_EXECUTION表中。该表是一个树形结构,包含PARENT_ID_属性。流程实例就是一个流程的根节点,其PARENT_ID_为null;而执行实例是流程实例的子节点,其PARENT_ID_为流程实例ID。
流程定义就像是类,流程实例则像是具体的类对象。
整个过程如下:
- 使用设计器设计的bpmn20.xml是流程模型,对流程模型进行部署,即得到了procdef流程定义,并保存到数据库。
- 对procdef流程定义进行startProcessInstanceById()启动,即可新建一个procinst流程实例并保存到数据库。
- 实例创建后,会推进到第一个审批节点并创建对应的Task保存到数据库。此时数据库里只有最新节点的Task。
- 对于当前的Task,执行complete()即可审批完成,这样当前Task会从数据库中删除,然后创建下一个节点的Task。
- 当所有Task执行完成,流程实例执行到结束节点,整个流程结束。
所有的中间数据在历史记录表中都会有记录。
变量
flowable中有三种变量:全局变量、局部变量、临时变量。
全局变量绑定到流程实例(Process Instance),生命周期与流程实例一致。
局部变量绑定到执行实例(Execution)或任务(Task),生命周期与绑定的对象相同。
流程实例持有全局变量(跨节点共享)。
执行实例可持有局部变量(仅当前分支有效)。
同一作用域下变量名不可重复;不同作用域下变量名可重复。
局部变量名可与全局变量名相同,会优先读取局部变量。
同作用域下,多次设置同名变量,后设置的会覆盖先设置的。
| 维度 | 全局变量 (Process Variables) | 局部变量 (Local Variables) | 临时变量 (Transient Variables) |
|---|---|---|---|
| 作用域 | 整个流程实例 (ProcessInstance) |
特定任务 (Task) 或执行实例 (Execution) |
当前事务或会话 |
| 生命周期 | 随流程实例结束而终止 | 随任务/执行实例结束而终止 | 事务结束即消失 |
| 存储位置 | ACT_RU_VARIABLE(运行时)ACT_HI_VARINST(历史) |
ACT_RU_VARIABLE(关联 TASK_ID_ 或 EXECUTION_ID_) |
内存,不持久化 |
| 变量名冲突 | 同流程实例下不可重复 | 不同作用域可同名(优先覆盖全局变量) | 无限制 |
| 典型场景 | 请假天数、流程状态 | 审批意见、分支临时数据 | 计算中间值、缓存 |
| 查询方式 | runtimeService.getVariables() |
taskService.getVariableLocal() |
execution.getTransientVariables() |
| 数据追溯 | 支持历史表长期审计 | 任务结束后仅历史表可查 | 不可追溯 |
| 性能影响 | 持久化操作,有数据库开销 | 持久化操作,作用域小开销较低 | 无IO操作,性能最优 |
注意区分使用场景:跨节点传递数据(如负责人、审批结果)时应使用全局变量;任务内部临时计算、隔离数据应使用局部变量。
因此,流程定义文件bpmn20.xml中如 ${admin} 这类表达式默认从全局变量解析,不能放在局部变量或临时变量中。
SpringBoot引入flowable
在pom.xml中引入依赖:
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter</artifactId>
<version>6.8.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
然后在MySql数据库中创建一个空schema,命名为flowable。
在工程的application.yml中添加配置:
spring:
application:
name: demo
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/flowable?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
hikari:
minimum-idle: 5
idle-timeout: 600000
maximum-pool-size: 10
auto-commit: true
pool-name: MyHikariCP
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
flowable:
async-executor-activate: false # 关闭定时任务
# database-schema-update 设置为 true ,则当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构更新至新版本
database-schema-update: true
注意MySql的驱动(driver-class-name)需要根据安装的MySql进行调整。当安装的MySQL版本小于8.0时,driver-class-name应使用com.mysql.jdbc.Driver;对于8.0及以上版本,driver-class-name应使用com.mysql.cj.jdbc.Driver。
这样flowable就引入完成了。启动工程,会发现数据库flowable创建了许多相关表。

SpringBoot这样引入的flowable会将ProcessEngine及四个模块的Service都添加到容器对象,需要使用时可直接注入:
@Resource
private ProcessEngine processEngine;
@Resource
private RepositoryService repositoryService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private HistoryService historyService;
ProcessEngine是最核心的流程引擎,四个模块的Service对象除了这样注入,也可以通过ProcessEngine获取。
下文中默认使用这里注入的对象。
使用
流程设计
可使用官方提供的flowable-UI来设计流程。
6.x版本的Release是包含flowable-UI的,下载地址:
https://github.com/flowable/flowable-engine/releases

注意需选择与pom.xml中引入依赖相同版本的release下载。
下载后解压,包含一个wars文件夹,里面包含两个文件:flowable-rest.war和flowable-ui.war。

下载Tomcat的zip版本并解压(注意不要放在中文目录下),将flowable-ui.war放到*\apache-tomcat-9.0.107\webapps*目录下:
- 打开*\apache-tomcat-9.0.107\conf\logging.properties*,找到
java.util.logging.ConsoleHandler.encoding = UTF-8,将其值改为GBK。 - 打开*\apache-tomcat-9.0.107\bin\startup.bat*,Tomcat控制台会运行,等待执行完成,这样flowable-ui.war会解压。
关闭Tomcat控制台,打开*\apache-tomcat-9.0.107\webapps\flowable-ui\WEB-INF\classes\flowable-default.properties*,找到如下内容:
#
# DATABASE
#
#spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:~/flowable-db/engine-db;AUTO_SERVER=TRUE;AUTO_SERVER_PORT=9093;DB_CLOSE_DELAY=-1
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable?characterEncoding=UTF-8
#spring.datasource.driver-class-name=org.postgresql.Driver
#spring.datasource.url=jdbc:postgresql://localhost:5432/flowable
#spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
#spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=flowablea
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:FLOWABLE
#spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
#spring.datasource.url=jdbc:db2://localhost:50000/flowable
spring.datasource.username=flowable
spring.datasource.password=flowable
在这里指定flowable-UI的数据库及用户名和密码。
注意若修改为MySql:
- 需要根据运行环境的MySQL版本设置
spring.datasource.driver-class-name为com.mysql.jdbc.Driver或com.mysql.cj.jdbc.Driver。 spring.datasource.url根据实际情况修改。- 找到mysql的驱动
mysql-connector-java-8.0.26.jar,复制到\apache-tomcat-9.0.107\lib目录下。
在flowable-default.properties中可以找到访问的默认设置:
server.port=8080
server.servlet.context-path=/flowable-ui
flowable.idm.app.admin.user-id=admin
flowable.idm.app.admin.password=test
因此启动成功后访问:
http://127.0.0.1:8080/flowable-ui/

输入用户名admin,密码test即可登录。

登录后进入建模器应用程序,在这里可以创建流程并在线编辑。
注意模型key,应人为保证全局唯一,支持使用该值查询流程。
这里建一个请假流程holiday,发起人发起后需经过人事审批和经理审批:
其中:
- 启动事件,发起人写
malou。 - 添加一个审批节点,名称设置为
人事审批,点击分配用户,选择固定用户,填写zhangsan。 - 添加一个审批节点,名称设置为
经理审批,点击分配用户,选择固定用户,填写lisi。 - 添加结束事件。
注意核心的审批节点需要指定分配用户属性,即谁负责该节点的审批。

模型创建完成后,可点击下载按钮来导出到BPMN2。

下载后,得到一个holiday.bpmn20.xml文件。其内容为:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef" exporter="Flowable Open Source Modeler" exporterVersion="6.8.1">
<process id="holiday" name="holiday" isExecutable="true">
<documentation>holiday</documentation>
<startEvent id="startEvent1" flowable:initiator="malou" flowable:formFieldValidation="true"></startEvent>
<userTask id="sid-1E848FE5-A27D-4327-9CDF-B50F1F2406FA" name="人事审批" flowable:assignee="zhangsan" flowable:formFieldValidation="true">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-2C451B03-25B3-4CAC-8813-23D7A3481F85" sourceRef="startEvent1" targetRef="sid-1E848FE5-A27D-4327-9CDF-B50F1F2406FA"></sequenceFlow>
<userTask id="sid-0FD5F025-98F1-4CBA-82B4-765834A6F1B8" name="经理审批" flowable:assignee="lisi

最低0.47元/天 解锁文章
2459

被折叠的 条评论
为什么被折叠?



