入行几年的程序员们, 多少都对工作流有所了解。Java语言支持的工作流有很多选择, 最早的JBPM, 到现在比较出名的Activiti, Camunda, Flowable等等, 都是比较常见的开源产品。
各家公司除了自己造轮子之外, 选择开源产品进行个性化开发, 是大部分中小团队最好的选择, 今天介绍一下Flowable, 解决如何下手的问题。
Flowable使用 Apache V2 license 协议开源, 支持 BPMN 2.0 行业标准。
让我们一起花三十分钟, 了解Flowable的安装, 建表, 设计器, API等常见问题。
0. 安装须知
本文基于Spring Boot集成方式进行介绍
官方网址:https://www.flowable.com/
Github:https://github.com/flowable/
开源协议Apache-2.0
基础软件及版本:
- Java 8
- Spring Boot 2.5
- Mysql 8.0
- Flowable 6.7.0
1. Maven
创建Spring Boot 项目, pom加入依赖
<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.7.0</version> </dependency>
1.1 建表
1.1.1 MySQL
由于需要支持TIMESTAMP (6) 类型, 因此5.6.4及以下版本无法使用
5.7或8.0安装成功
两种初始化建表方式:sql脚本,或是boot自动。
sql方式请参考1.1.2
按以下方法启动Spring Boot项目,可自动建表
建表时, 连接串需要&nullCatalogMeansCurrent=true
spring: datasource: url: jdbc:mysql://192.168.1.123:3306/flowable?useSSL=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true username: root password: pass driverClassName: com.mysql.cj.jdbc.Driver
建表后可关闭, 下次启动不会再次建表
flowable: database-schema-update: false
默认会启动liquibase, 可关闭
spring: liquibase: enabled: false
1.1.2 Oracle 等其他数据库
据多个朋友反馈,Oracle建库可能出现建表语句不全的问题,推荐大家从github下载发布包,执行内部的建表语句,包括mysql也可以采用这种方式。
下载地址:https://github.com/flowable/flowable-engine/releases/tag/flowable-6.7.0
下载后,执行里面的database脚本即可。
初次使用,可以选择create - all的脚本执行。
常用的db2、mssql、mysql、oracle、postgresql都有,还有一个奇怪的h2混了进来
h2是演示版系统默认的库,但我没实际用过。
1.1.3 国产数据库
默认情况下不支持国产脚本,经测试达梦可以成功使用,需要人工按照Oracle的库表调整。
2. 设计器
各大开源流程工具都遵从BPM标准, 一般流程设计都是以BPM格式的XML文件进行定义。但我们不可能去手写配置文件, 一般都借助于可视化设计器。
官方给的Web设计器大致分两个版本, 需要自行部署到Tomcat运行, 并且需要连接到前面建的数据库。
2.1 Flowable 6.5版本以前的
6.5版本的方法仅供参考, 本文使用2.2的设计器
官网下载设计器, 然后部署到tomcat, 包括
- flowable-admin
- flowable-idm
- flowable-modeler
- flowable-rest
- flowable-task
启动tomcat, 流程设计器访问 http://localhost:8080/flowable-modeler
默认login/password: admin/test
自带H2数据库, 可修改flowable-default.properties更改数据源, 文件在各个模块的/WEB-INF/classes/下面
2.2 Flowable 6.6版本以后的
推荐使用
官网下载, 只有2个包
- flowable-rest
- flowable-ui
访问地址:
http://localhost:8080/flowable-rest/docs/ (login/password: rest-admin/test)
http://localhost:8080/flowable-ui (login/password: admin/test)
修改数据源:
打开/WEB-INF/classes/flowable-default.properties, 搜索spring.datasource相关配置, 改为步骤1中的数据库地址即可。
2.3 Eclipse设计器插件
Eclipse设计器属于离线设计器, 无需连库, 成果以xml文件方式保存, 可以通过发布程序发送至流程引擎。
安装步骤:
- help - install new software
- add网址 name: flowable bpmn designer, location: http://www.flowable.org/designer/update/ , 点击add
- 选中flowable eclipse bpmn 2.0 designer, 点next, next, I accept, finish, install anyway
- restart
- 新建flowable project
- 在diagrams下面, 新建流程图即可
2.4 设计器说明
2.4.1 启动事件
流程的起点, 必须且仅有1个。
可配置开始表单, 启动时要求发起人立即填写一些内容。
也可以留空, 仅作为默认起点。
2.4.2 结束事件
流程的重点, 必须有1个或多个, 可以有正常结束/异常结束等等
2.4.3 用户任务
需要用户参与的任务节点, 最常见的节点。
存在四种情况:
- assignee 确定处理人, 记录处理人id
- assignee 变量处理人, 设计时记为 ${userid} 形式, 通过传参确定处理人
- candidateUser 候选人形式, 记录多个候选人id, 由候选人进行抢占claim接收任务
- candidateGroup 候选组(角色)形式, 记录多个候选组id, 由候选组内的人进行抢占claim接收任务
2.4.4 服务任务
不等待节点。执行实例走到服务任务节点之后会继续往下流转。
2.4.5 脚本任务
不等待节点。脚本类型有javascript、groovy、juel
2.4.6 排他网关
根据变量值的条件判断, 决定后续路径
用条件表达式也能实现同等功能
按XML中定义的顺序, 执行第一个满足条件的路径。如果都不符合则会报错
2.4.7 并行网关
具有分支和汇聚节点, 不解析条件, 多个路径同时并行
在Flowable中, 如果流程是多路并行的, 可以在任务上设置为并行任务, 以替代传统工作流的多个相同任务的并行行为。
2.4.8 包容网关
解析条件, 并执行所有符合条件的路径
3. 表说明
自动生成的表中, 有很多是支持流程设计器的表, 真正流程运行所需的表并没有那么多。
如果用过Activity的同学, 就会发现表名很多相同的, 但Flowable的表多了很多, 毕竟两者早期是同一个产品。
表的功能一般可以通过第二个词语缩写来进行区分。
3.1 ACT_RE_*
’RE’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
3.2 ACT_RU_*
’RU’表示runtime。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
3.3 ACT_ID_*
’ID’表示identity(组织机构)。这些表包含标识的信息,如用户,用户组,等等。
一般在正式系统中, 会将这些表用业务系统的组织机构, 角色表进行替换。
3.4 ACT_HI_*
’HI’表示history。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。
3.5 ACT_GE_*
普通数据,各种情况都使用的数据。
4. 自定义表单
内置自定义表单功能, 可以实现一些简单的表单定义, 但真正业务开展时, 很难对复杂多变的情况进行支撑, 不建议使用。
大家如果要在开发的系统中, 对Flowable进行改造开发, 表单设计将是其中最复杂的部分。以后有时间单独写一篇文章进行介绍
5. 流程版本
流程定义文件是xml格式, 交由流程引擎的ProcessDefinition服务进行发布。
ProcessDefinition每次发布时, 会根据key进行版本控制, 按数值顺序1,2,3递增
启动流程时, 根据key启动, 则会自动选择版本最高的, 产生流程实例
6. API
引擎API是与Flowable交互的最常用手段。总入口点是ProcessEngine。
在Spring Boot项目中, 这些对象都会被Spring容器管理, 可以直接引用
public class MyTestController { @Autowired private ProcessEngine processEngine; @Autowired private RepositoryService repositoryService; }
6.1 ProcessEngines
流程引擎的引用, 单例唯一, 可以通过它获得所有api的服务对象
6.2 RepositoryService
管理与控制部署(deployments)与流程定义(process definitions)的操作
- 部署上传定义文件xml至引擎, 部署包中的所有流程都可以启动。
- 查询引擎现有的部署与流程定义。
- 暂停或激活部署中的某些流程,或整个部署。
- 获取各种资源,比如部署中保存的文件,或者引擎自动生成的流程图。
- 获取POJO版本的流程定义。它可以用Java而不是XML的方式查看流程。
6.3 TaskService
人类用户参与操作的任务, 即我们开发的软件中"我的待办任务"等内容.
- 查询分派给用户或组的任务
- 创建独立运行(standalone)任务。这是一种没有关联到流程实例的任务。
- 决定任务的执行用户(assignee),或者将用户通过某种方式与任务关联。
- 认领(claim)任务。认领是指某人决定成为任务的执行用户,也即他将会完成这个任务。
- 完成(complete)任务是指“做这个任务要求的工作”,通常是填写某个表单。
6.4 IdentityService
- 用于管理(创建,更新,删除,查询……)组与用户。
- 在运行时, 系统并不做任何用户检查, 即用户表中可能不存在该用户。
6.5 FormService
是可选服务。提供简单的表单功能
- 引入了开始表单(start form)与任务表单(task form)的概念。
- 开始表单是在流程实例启动前显示的表单,而任务表单是用户完成任务时显示的表单。
6.6 HistoryService
查询Flowable引擎收集的所有历史数据。
运行期的数据会同步至历史数据表, 因此运行期的数据表始终保持在一个比较低的数据量, 而历史表则越来越大
- 流程实例启动时间
- 谁在执行哪个任务
- 完成任务花费的事件
- 每个流程实例的执行路径
6.7 ManagementService
通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。
使用作业,包括定时器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed suspension/activation)等等
6.8 DynamicBpmnService
可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。
7. 设计器整合
在开发自己的系统时, 整合工作流, 我们往往需要程序里提供一个菜单, 实现流程的可视化配置, 拖拽, 保存, 版本管理等工作, 利用官方的设计器, 我们可以快速构造一个独立的Spring Boot工程, 提供设计器界面, 通过Url集成的方式加入我们的项目当中。
方法: 对flowable-ui-common进行部分改造
步骤:
1.创建boot项目
2.增加依赖包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-engine</artifactId> <version>6.7.0</version> </dependency> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-ui-common</artifactId> <version>6.7.0</version> </dependency> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter-ui-modeler</artifactId> <version>6.7.0</version> </dependency> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter-ui-idm</artifactId> <version>6.7.0</version> </dependency>
3.如果要去掉登录, 则可以对以下文件的当前用户权限相关信息加以干涉, 设置默认值或是屏蔽。
org.flowable.ui.common.rest.idm.remote.RemoteAccountResource org.flowable.ui.common.security.SecurityUtils org.flowable.ui.modeler.conf.ModelerSecurityConfiguration
并重写模型设计器的保存和查询方法, 解决写入创建人的问题。
org.flowable.ui.modeler.rest.app.ModelResource org.flowable.ui.modeler.rest.app.ModelsResource
启动之后就能看到设计器界面了
8. 汉化
使用中, 会遇到设计器汉化不完整的情况, 可以在改造项目中, 自行创建目录 resource/static/modeler/i18n/zh-CN.json , 进行汉化
官方的汉化很多词语都直接是英文, 或者翻译不当, 因此一般是自己进行汉化补充, 需要汉化文件的可以与我联系。
以上就是对Flowable工作流的简单介绍, 希望大家能顺利使用。