flowable基础入门

概念

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。

流程定义就像是类,流程实例则像是具体的类对象。
整个过程如下:

  1. 使用设计器设计的bpmn20.xml是流程模型,对流程模型进行部署,即得到了procdef流程定义,并保存到数据库。
  2. 对procdef流程定义进行startProcessInstanceById()启动,即可新建一个procinst流程实例并保存到数据库。
  3. 实例创建后,会推进到第一个审批节点并创建对应的Task保存到数据库。此时数据库里只有最新节点的Task。
  4. 对于当前的Task,执行complete()即可审批完成,这样当前Task会从数据库中删除,然后创建下一个节点的Task。
  5. 当所有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-namecom.mysql.jdbc.Drivercom.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
### Java Flowable 综合教程 #### 了解Flowable框架的基础概念 Flowable 是一种轻量级的工作流和业务流程管理 (BPM) 平台,专为开发人员设计。它支持 BPMN 2.0 标准,并提供了一套易于使用的 API 来定义、启动以及管理和监控业务流程。 为了更好地理解如何使用 Flowable 构建应用程序,下面将介绍几个核心组件: - **Process Engine**: 负责执行已部署的流程定义。当启动 process 实例时,需要一些初始化变量,这些通常由外部输入提供,例如通过 Scanner 获取或线上接口传递过来[^1]。 - **Variables**: 在处理过程中用于存储数据项。所有的 variables 都是以 map 键值对形式存在,其中 key 只能是 String 类型而 value 则可以是任意 Java 对象;如果必要的话,Flowable 将自动对其进行序列化操作[^2]。 #### 设计与实现简单的工作流应用 要创建一个基本的应用程序来展示 Flowable 的功能,可以从以下几个方面入手: - 使用 XML 或 JSON 文件描述业务逻辑; - 编写代码以编程方式配置 ProcessEngineConfiguration 和构建 ProcessEngine; - 添加必要的 listeners 和 services 来扩展默认行为; - 测试完整的生命周期——从部署新版本直到完成特定的任务实例。 #### 掌握复杂的控制结构 对于更复杂的需求来说,掌握好各种类型的网关是非常重要的。比如 fork 分支允许同时开启多条路径作为并发任务去运行;join 汇聚则确保只有当所有指定条件满足之后才会继续前进。值得注意的是,在某些情况下,同一并行网关可能既包含分支又包含汇聚的功能,这意味着它会先收集来自不同方向的信息再分发给后续节点[^3]。 ```xml <parallelGateway id="fork" name="Fork Gateway"/> <!-- ... other elements here --> <parallelGateway id="join" name="Join Gateway"/> ``` #### 提升技能至高级水平 随着经验的增长和技术能力的进步,探索更多关于自定义持久层、集成第三方服务端点或是优化性能等方面的知识变得至关重要。这不仅有助于提高系统的灵活性和可维护性,还能让开发者能够针对具体项目需求做出更加精准的选择。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值