Flowable 是什么?
- Flowable 是一个使用 Java 编写的轻量级业务流程引擎,使用 Apache V2 license 协议开源。2016 年 10 月,Activiti 工作流引擎的主要开发者离开 Alfresco 公司并在 Activiti 分支基础上开启了 Flowable 开源项目。基于 Activiti v6 beta4 发布的第一个 Flowable release 版本为6.0。以 JAR 形式发布使得 Flowable 可以轻易加入任何Java环境:Java SE、Tomcat、Jetty 或 Spring 之类的 servlet 容器;JBoss 或 WebSphere 之类的 Java EE 服务器等等。 另外,也可以使用 Flowable REST API 进行 HTTP 调用。详情请见:flowable.com
Flowable 可以做什么?
- 可以处理流程流转相关的业务,比如审批流、工作流等,可以处理复杂多变的业务场景,因为对于很明确的需求可以硬编码实现业务逻辑,但是对于未知的复杂多变的业务场景,就需要上业务流程引擎(business process engine, bpm)了,这样能根据实际业务流程建模,从而处理更加复杂的任务。
- 不是全能选手。工作流引擎往往只是个辅助业务进行实现的东西,不要所有东西全部依赖工作流,需要结合业务本身,量体裁衣。
- flowable的一些商业案例:flowable.com/casestudies...
Flowable包含的组件有哪些?
-
Flowable IDM: 身份管理应用。为所有Flowable UI应用提供单点登录认证功能,并且为拥有IDM管理员权限的用户提供了管理用户、组与权限的功能。
-
Flowable Modeler: 让具有建模权限的用户可以创建流程模型、表单、选择表与应用定义。
-
Flowable Task: 运行时任务应用。提供了启动流程实例、编辑任务表单、完成任务,以及查询流程实例与任务的功能。
-
Flowable Admin: 管理应用。让具有管理员权限的用户可以查询BPMN、DMN、Form及Content引擎,并提供了许多选项用于修改流程实例、任务、作业等。管理应用通过REST API连接至引擎,并与Flowable Task应用及Flowable REST应用一同部署。
-
API 服务:引擎API是与Flowable交互的最常用手段。总入口点是ProcessEngine。ProcessEngine可以使用多种方式创建。使用ProcessEngine,可以获得各种提供工作流/BPM方法的服务。ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。
名称 含义 说明 ProcessEngine 流程引擎 流程设计、发布、任务的查询和操作等 DmnEngine 决策引擎 各决策表的配置和使用等 FormEngine 表单引擎 动态表单的设计和使用 IdmEngine 身份引擎 提供用户和用户组还有权限的创建、修改、删除等 ContentEngine 内容引擎 提供对Mybatis的封装,还提供了文件读取、文件保存的功能 -
Flowable整体是通过ProcessEngine来操作的。即不管什么框架操作流程,都需要通过ProcessEngine这个类来处理。ProcessEngine是Flowable对外公开的门面。UML类图如下: 关系图如下:
Flowable 数据库表类别
前缀 | 含义 | 说明 |
---|---|---|
ACT_RE_* | RE表示repository | RepositoryService接口操作的表。如,流程定义,流程的资 源(图片,规则等) |
ACT_RU_* | RU表示runtime | 运行时流程变量,用户任务,定时任务等,流程实例结束时将被删除 |
ACT_ID_* | ID表示identity | 存储如用户,用户组,权限等,flowable画图时,选择受理人或受理组就会查询这些表 |
ACT_HI_* | HI表示history | 历史的相关数据,如结束的流程实例,变量,任务等 |
ACT_GE_* | GE表示general | 普通数据,各种情况都使用的数据 |
通用数据表
表名 | 说明 |
---|---|
ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 |
ACT_GE_PROPERTY | 系统相关属性 |
流程定义表
表名 | 说明 |
---|---|
ACT_RE_DEPLOYMENT | 部署单元信息 |
ACT_RE_MODEL | 模型信息,通过flowable-modler画图程序时才会产生该记录 |
ACT_RE_PROCDEF | 已部署的流程定义 |
历史记录表
表名 | 说明 |
---|---|
ACT_HI_PROCINST | 历史的流程实例 |
ACT_HI_TASKINST | 历史的任务实例 |
ACT_HI_ACTINST | 历史的流转节点信息 |
ACT_HI_ATTACHMENT | 历史的流程附件 |
ACT_HI_COMMENT | 历史的说明性信息 |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 |
ACT_HI_IDENTITYLINK | 历史的流程运行过程中用户关系 |
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 | 用户登录令牌日志表 |
ACT_ID_USER | 用户表 |
运行实例表
表名 | 说明 |
---|---|
ACT_RU_TASK | 运行时任务表 |
ACT_RU_EXECUTION | 运行时流程执行实例 |
ACT_RU_VARIABLE | 运行时变量表 |
ACT_RU_TIMER_JOB | 定时作业表 |
ACT_RU_JOB | 运行时作业表 |
ACT_RU_IDENTITYLINK | 运行时用户关系信息,候选用户、候选组 |
ACT_RU_EVENT_SUBSCR | 运行时事件 |
ACT_RU_DEADLETTER_JOB | 正在运行的任务表 |
ACT_RU_HISTORY_JOB | 历史作业表 |
ACT_RU_SUSPENDED_JOB | 暂停作业表 |
其他表
本机如何体验flowable?
- 如果本机已经安装过docker(mac下如何安装docker),则比较简单,运行以下命令
arduino
docker run -p8080:8080 flowable/flowable-ui
运行成功后,在浏览器输入http://localhost:8080/flowable-ui 默认账号密码(admin/test)
-
如果不想按照docker,则可以下载对应的flowable版本,下载列表请见:github.com/flowable/fl...
-
下载其中一个版本,比如flowable-engine-flowable-6.4.1.zip,解压后flowable-engine-flowable-6.4.1
-
解压后,进入wars目录,截图如下:
-
当前目录运行以下脚本启动程序,注意顺序(先启动idm,再启动modeler)
inijava -jar flowable-idm.war java -jar flowable-modeler.war --server.port=8888
-
然后浏览器输入http://localhost:8888/flowable-modeler/,输入默认账号密码(admin/test)进入对应页面。
我们系统是如何来使用flowable的能力的?
-
考虑到我们的工作流可能有跨租户的需求或者对外提供能力(当时的需求概况),所以把flowable脱离出多租户体系,单库应用。worflow是flowable和业务方之间的中间人(月老),牵线搭桥,促成良缘。简单关系如下(避免出现三角恋):
-
flowable的工程搭建(比较简单)
- spring-boot 集成,直接选择 flowable-spring-boot-starter,里面提供了齐全的 REST API。引入方式很简单,pom中增加依赖如下:
java<!-- Flowable spring-boot 版套餐 --> <dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.4.1</version> </dependency>
-
也可以直接选择
flowable-engine
。java<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-engine</artifactId> <version>6.4.1</version> </dependency>
-
初始化配置
java// 流程引擎配置 ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration() .setDataSource(dataSource) // 初始化基础表,不需要的可以改为 ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE .setDatabaseSchemaUpdate(ProcessEngineConfiguration. DB_SCHEMA_UPDATE_TRUE) // 设置发件人用户名 .setMailServerUsername("管理员") // 解决流程图乱码 .setActivityFontName("宋体") .setLabelFontName("宋体") .setAsyncExecutorActivate(true) .setAnnotationFontName("宋体"); // 初始化流程引擎对象 log.info("=============================ProcessEngine初始化完成============================="); return cfg.buildProcessEngine();
-
我们主要是使用的是BPMN Engine的能力,需要自己来抽象流程,可以通过本地启动modeler服务设计流程(生成的是一个xml文件),并发布到flowable引擎中,modeler的设计界面如下:
-
flowable可以集成modeler的UI设计界面(目前我们没集成),后续有兴趣的同学可以一起参与哈。
-
业务流引擎重点是把业务流程抽象出来,通过modeler来画出来,发布到引擎中,每个人对业务流程的抽象都不一样,只要结果一样,流程图可以不一样的。
-
具体怎么画流程,给大家稍微演示一遍。
我们踩过哪些坑?
- 我们在测试环境利用flowable自动创建表结构来生成的相关表,预发的时候就直接用的测试环境的DDL脚本来执行(没利用程序再自动生成),结果发现很多表没有创建。经过检查发现因为数据库编码不一致会导致的。我们测试环境的数据库小版本和预发数据库的小版本不一致(创建数据库时候的编码不一样),后让运维修改编码完成。
- 因为flowable在数据库版本管控上使用的是Liquibase进行管控。所以在自动创建完flowable的数据库之后。一定要将ProcessEngineConfiguration的database-schema-update改成false。不然当不同的人更改了flowable的版本,会自动更新表结构。会导致问题。
- 中国式的前加签、后加签功能,flowable本身不支持,无法在引擎层面支持,最后在workflow对接层做了改造,以满足前后加签的功能需求。
- 所有节点的ID不能是数字。Flowable在定义的节点中不能是数字作为节点的Id。数字作为节点的ID会出现异常。
相关文档
- 目前最新的版本是v6.6.0,详细地址:flowable.com/open-source...
- github资源地址:github.com/flowable
- flowable中文使用手册:jeesite.gitee.io/front/flowa...