掘金 后端 ( ) • 2024-04-20 10:02

1357274.png

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 调用。详情请见:https://flowable.com

Flowable 可以做什么?

  • 可以处理流程流转相关的业务,比如审批流、工作流等,可以处理复杂多变的业务场景,因为对于很明确的需求可以硬编码实现业务逻辑,但是对于未知的复杂多变的业务场景,就需要上业务流程引擎(business process engine, bpm)了,这样能根据实际业务流程建模,从而处理更加复杂的任务。
  • 不是全能选手。工作流引擎往往只是个辅助业务进行实现的东西,不要所有东西全部依赖工作流,需要结合业务本身,量体裁衣。
  • flowable的一些商业案例:https://flowable.com/casestudies/

Flowable包含的组件有哪些?

image.png

  • 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类图如下: image.png 关系图如下: image.png

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 暂停作业表

其他表

image.png

本机如何体验flowable?

docker run -p8080:8080 flowable/flowable-ui

运行成功后,在浏览器输入http://localhost:8080/flowable-ui 默认账号密码(admin/test)

  • 如果不想按照docker,则可以下载对应的flowable版本,下载列表请见:https://github.com/flowable/flowable-engine/releases

  • 下载其中一个版本,比如flowable-engine-flowable-6.4.1.zip,解压后flowable-engine-flowable-6.4.1 image.png

  • 解压后,进入wars目录,截图如下: image.png

  • 当前目录运行以下脚本启动程序,注意顺序(先启动idm,再启动modeler)

    java -jar flowable-idm.war 
    java -jar flowable-modeler.war --server.port=8888
    
  • 然后浏览器输入http://localhost:8888/flowable-modeler/,输入默认账号密码(admin/test)进入对应页面。 image.png

我们系统是如何来使用flowable的能力的?

  • 考虑到我们的工作流可能有跨租户的需求或者对外提供能力(当时的需求概况),所以把flowable脱离出多租户体系,单库应用。worflow是flowable和业务方之间的中间人(月老),牵线搭桥,促成良缘。简单关系如下(避免出现三角恋): image.png

  • flowable的工程搭建(比较简单)

    • spring-boot 集成,直接选择 flowable-spring-boot-starter,里面提供了齐全的 REST API。引入方式很简单,pom中增加依赖如下:
    <!-- Flowable spring-boot 版套餐 --> 
    <dependency> 
        <groupId>org.flowable</groupId> 
        <artifactId>flowable-spring-boot-starter</artifactId> 
        <version>6.4.1</version> 
    </dependency>
    
  • 也可以直接选择 flowable-engine

    <dependency> 
        <groupId>org.flowable</groupId> 
        <artifactId>flowable-engine</artifactId> 
        <version>6.4.1</version> 
    </dependency>
    
  • 初始化配置

    // 流程引擎配置 
    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的设计界面如下: image.png

  • flowable可以集成modeler的UI设计界面(目前我们没集成),后续有兴趣的同学可以一起参与哈。

  • 业务流引擎重点是把业务流程抽象出来,通过modeler来画出来,发布到引擎中,每个人对业务流程的抽象都不一样,只要结果一样,流程图可以不一样的。

  • 具体怎么画流程,给大家稍微演示一遍。

我们踩过哪些坑?

  • 我们在测试环境利用flowable自动创建表结构来生成的相关表,预发的时候就直接用的测试环境的DDL脚本来执行(没利用程序再自动生成),结果发现很多表没有创建。经过检查发现因为数据库编码不一致会导致的。我们测试环境的数据库小版本和预发数据库的小版本不一致(创建数据库时候的编码不一样),后让运维修改编码完成。
  • 因为flowable在数据库版本管控上使用的是Liquibase进行管控。所以在自动创建完flowable的数据库之后。一定要将ProcessEngineConfiguration的database-schema-update改成false。不然当不同的人更改了flowable的版本,会自动更新表结构。会导致问题。
  • 中国式的前加签、后加签功能,flowable本身不支持,无法在引擎层面支持,最后在workflow对接层做了改造,以满足前后加签的功能需求。
  • 所有节点的ID不能是数字。Flowable在定义的节点中不能是数字作为节点的Id。数字作为节点的ID会出现异常。

相关文档

  • 目前最新的版本是v6.6.0,详细地址:https://flowable.com/open-source/downloads/
  • github资源地址:https://github.com/flowable
  • flowable中文使用手册:https://jeesite.gitee.io/front/flowable/6.4.2/bpmn/index.html#_introduction