Flowable

integrated-development

Flowable是Activiti原班主创人员从activiti-6.0.0.Beta4 分支重新开发出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎,易于与 Spring集成使用。

官网:https://www.flowable.com (opens new window)

开源项目:https://github.com/flowable (opens new window)

官方下载地址:http://www.flowable.org/downloads.html (opens new window)

Flowable BPMN中文用户手册(v6.3.0) (opens new window)

# 一、工作流

Workflow 工作流

WfMS Workflow Management System 工作流管理系统

WfMC Workflow Management Coalition 工作流管理系统

工作流就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

工作流管理系统是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。

工作流管理联盟给出的关于工作流管理系统的定义是:工作流管理系统是一个软件系统,它通过执行经过计算的流程定义去支持一批专门设定的业务流程。工作流管理系统被用来定义、管理、和执行工作流程。

工作流管理系统的目标:管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预。

# 常用工作流实现

  • Activiti
  • Flowable

# Flowable与Activiti对比

目前Flowable已经修复了Activiti6很多的bug,可以实现零成本从Activiti迁移到Flowable。

Flowable目前已经支持加签、动态增加实例中的节点、支持CMMN、DMN规范。这些都是Activiti6目前版本没有的。

1、Flowable已经支持所有的历史数据使用mongdb存储,Activiti没有。

2、Flowable支持事务子流程,Activiti没有。

3、Flowable支持多实例加签、减签,Activiti没有。

4、Flowable支持HttpTask等新的类型节点,Activiti没有。

5、Flowable支持在流程中动态添加任务节点,Activiti没有。

6、Flowable支持历史任务数据通过消息中间件发送,Activiti没有。

7、Flowable支持Java11,Activiti没有。

8、Flowable支持动态脚本,Activiti没有。

9、Flowable支持条件表达式中自定义juel函数,Activiti没有。

10、Flowable支持CMMN规范,Activiti没有。

11、Flowable修复了DMN规范设计器,Activiti用的dmn设计器还是旧的框架,BUG太多。

12、Flowable屏蔽了PVM,Activiti6也屏蔽了PVM(因为6版本官方提供了加签功能,发现PVM设计的过于臃肿,索性直接移除,这样加签实现起来更简洁、事实确实如此,如果需要获取节点、连线等信息可以使用bpmnmodel替代)。

13、Flowable与Activiti提供了新的事务监听器。Activiti5版本只有事件监听器、任务监听器、执行监听器。

14、Flowable对Activiti的代码大量的进行了重构。

15、Activiti以及Flowable支持的数据库有h2、hSQL、MySQL、Oracle、Postgres、msSQL、db2。其他数据库不支持的。使用国产数据库的可能有点失望了,需要修改源码了。

16、Flowable支持JMS、RabbitMQ、MongoDB方式处理历史数据,Activiti没有。

# 二、基础概念

# 流程定义和流程实例

比如我们要构建的流程是一个非常简单的请假流程,在Flowable术语中,我们将其称为一个流程定义(process definition)

一个流程定义可以启动多个流程实例(process instance)。在这个例子中,流程定义定义了请假的各个步骤,而一个流程实例对应某个雇员提出的一个请假申请。

# BPMN 2.0

Flowable引擎需要流程定义为BPMN 2.0格式,这是一个业界广泛接受的XML标准。

BPMN 2.0存储为XML,并包含可视化的部分:使用标准方式定义了每个步骤类型(人工任务,自动服务调用,等等)如何呈现,以及如何互相连接。这样BPMN 2.0标准使技术人员与业务人员能用双方都能理解的方式交流业务流程。

# 三、Flowable API

# RuntimeService

  • RuntimeService 主要用于管理流程在运行时产生的数据(流程参数, 事件, 流程实例, 以及执行情况)以及对正在运行的流程进行操作的API.
  • 系统用户需要执行的任务是Flowable等BPM引擎的核心. 而任务周围的任务都被分组到TaskService中, 如:
  1. 查询分配给用户或组的任务.
  2. 创建新的独立任务. 这些是与流程实例无关的任务.
  3. 操作向哪个用户分配任务或者哪个用户以某种方式参与任务.
  4. 声称和完成一项任务. 声称意味着有人决参与任务, 这也意味着该用户将完成该任务. 完成意味着完成任务的工作.

# IdentityService

  • IdentityService是非常简单的. 它支持组和用户的管理(创建, 更新, 删除, 查询).
  • Flowable实际上不会在运行时对用户进行任何检查. 例如, 可以将任务分配给任何用户, 但是引擎不验证该用户是否被系统知晓. 这是意味着Flowable引擎也可以与LDAP, Active Directory等服务结合使用.

# FormService

FormService 是一个可选的服务. 该服务引入了开始表和任务表的概念. 开始形式是流程实例启动前显示给用户的一种形式, 而任务形式是当一个用户要填写一份表的时候进行显示.

# HistoryService

HistoryService 服务公开有关正在进行和历史进程实例的信息.

这与运行时信息不同, 因为此运行时信息仅在任何特定时刻包含实际运行时状态, 并且针对运行时进程执行性能进行了优化. 历史信息(谁做了哪些任务, 完成任务需要多长时间, 每个流程实例遵循哪条路径, 等等)经过优化, 易于查询, 并且永久保存.

# ManagementService

ManagementService 为流程引擎上的管理和维护操作提供服务. 此外, 它还暴露了查询功能和作业管理操作. 作业在Flowable中用于各种事情, 如定时器, 异步延续, 延迟挂起/激活等等.

# DynamicBpmnService

DynamicBpmnService 可以用来改变流程定义的一部分, 而无需重新部署. 例如, 可以在流程定义中更改用户任务的受理人或者更改服务任务的类名称.

# 四、数据库表

Flowable的所有数据库表都以ACT_开头。

第二部分是说明表用途的两字符标示符。

服务API的命名也大略符合这个规则。

Flowable提供了30张表。如下:

  • ACT_RE_*:

    'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。

    • ACT_RE_DEPLOYMENT 流程部署表
    • ACT_RE_PROCDEF 流程定义信息表
    • ACT_RE_MODEL 模型信息表(此表已经舍弃,更换为ACT_DE_MODEL)
  • ACT_RU_*:

    'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。

    • ACT_RU_EXECUTION 流程实例与分支执行表
    • ACT_RU_TASK 用户任务表
    • ACT_RU_VARIABLE 变量信息
    • ACT_RU_IDENTITYLINK 参与者相关信息表
    • ACT_RU_EVENT_SUBSCR 事件订阅表
    • ACT_RU_JOB 作业表
    • ACT_RU_TIMER_JOB 定时器表
    • ACT_RU_SUSPENDED_JOB 暂停作业表
    • ACT_RU_DEADLETTER_JOB 死信表
    • ACT_RU_HISTORY_JOB 历史作业表
  • ACT_HI_*:

    'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。

    • ACT_HI_PROCINST 历史流程实例表
    • ACT_HI_ACTINST 历史节点信息表
    • ACT_HI_TASKINST 历史任务表
    • ACT_HI_VARINST 历史变量
    • ACT_HI_IDENTITYLINK 历史参与者表
    • ACT_HI_DETAIL 历史的流程运行中的细节信息
    • ACT_HI_ATTACHMENT 附件表
    • ACT_HI_COMMENT 评论表
  • ACT_GE_*:

    通用数据。在多处使用。

    • ACT_GE_PROPERTY 属性表(保存流程引擎的kv键值属性)
    • ACT_GE_BTYEARRAY 资源表(存储流程定义相关的资源)

详细表字段信息请参考:https://blog.csdn.net/zhongzk69/article/details/90944593 (opens new window)

# 五、Flowable使用

# 与Spring的整合

  • 首先引入Flowable相关JAR
    <!--flowable工作流依赖-->
    <dependency>
        <groupId>org.flowable</groupId>
        <artifactId>flowable-spring-boot-starter</artifactId>
        <version>6.3.0</version>
    </dependency>
1
2
3
4
5
6

# 创建流程实例

  • 在resources下创建processes文件夹,并将定义好的流程文件(**.bpmn20.xml)放到文件夹内部,这样在启动的时候spring会自动将文件载入,用到下面接口的时候直接注入即可.
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private RepositoryService repositoryService;
    @Autowired
    private ProcessEngine processEngine;
1
2
3
4
5
6
7
8
    /**
     * 提交请假申请,开启流程
     */
    @RequestMapping(value = "leaveApply")
    @ResponseBody
    public String leaveApply(String userId, String startTime, String endTime) {
        //启动流程
        HashMap<String, Object> map = new HashMap<>();
        map.put("userId", userId);
        map.put("startTime", startTime);
        map.put("endTime", endTime);
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("LeaveApply", map);
        return "提交成功.流程Id为:" + processInstance.getId();
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • LeaveApply是上述流程定义xml文件中流程ID,根据流程ID调用runtimeService.startProcessInstanceByKey即可开启流程实例.

# 六、设计器使用

设计器主要有

  • Flowable Designer(Eclipse)
  • Flowable Web Modeler(Web应用)
  • actiBPM(IDEA插件)

三种我都尝试了一下,其中actiBPM(idea插件)效果不好而且经常报错;

其次Flowable Designer(Eclipse)在使用中只能生产.bpmn文件需要手动改后缀,个人用着效果同样不是很好;

最终选择了基于web应用的Flowable Web Modeler。

# Flowable Web部署

Flowable提供了几个web应用,用于演示及介绍Flowable项目提供的功能:

Flowable IDM: 身份管理应用。为所有Flowable UI应用提供单点登录认证功能,并且为拥有IDM管理员权限的用户提供了管理用户、组与权限的功能。

  1. 下载地址:https://flowable.com/open-source/downloads (opens new window)

  2. 将下面目录下的jar包copy到tomcat下,并启动;

  3. 由于Flowable Web Modeler默认使用的是h2数据库,下次重启后相关数据都会消失,所以建议将其改成mysql数据库,改动配置如下,另外需要将mysql驱动包扔到lib目录下;

  4. 重新启动tomcat,进入到如下地址: http://localhost:8080/flowable-idm (opens new window)

默认用户名:admin/test

# 七、Flowable权限

# 权限说明

Flowable默认提供了一套自己的权限管理接口(IDM),但是从Flowable 6开始,IDM的组件被独立出来,分为几个不同的模块:flowable-idm-api, flowable-idm-engine, flowable-idm-spring 和 flowable-idm-engine-configurator。

使用Flowable提供的IdmEngine,也有三种方案: 方案一:Flowable默认提供的IdmEngine已经实现IdmIdentityService接口,包含对用户、组、权限等的操作;

方案二:集成LDAP来实现轻量级用户权限管理。LDAP内部已经实现IdmIdentityService接口,包含对用户、组、权限等的操作;

方案三:自定义实现IdmIdentityService接口,实现对用户、组、权限的操作;

# 权限默认实现

Flowable默认提供了两种方式可以处理权限相关:

  • 1 通过IdentityService,这个服务主要用来管理用户和组,不能操作具体的权限。是简单版

       processEngine.getIdentityService();
    
    1
  • 2 通过IdmIdentityService,可以用户和组,同时可以处理具体的权限(Privilege),在IdentityService之上做了增强,但两者是不同的接口。

     IdmEngineConfigurator idmEngineConfigurator = new IdmEngineConfigurator();
    
     cfg.setIdmEngineConfigurator(idmEngineConfigurator);
    
     // 会初始化processEngine,同时初始化配置在里面的Configurator,如IdmEngineConfigurator
     ProcessEngine processEngine = cfg.buildProcessEngine();
    
     IdmIdentityService idmIdentityService = idmEngineConfigurator.getIdmEngineConfiguration().getIdmIdentityService();
    
    1
    2
    3
    4
    5
    6
    7
    8

# 权限相关表结构

  • ACT_ID_USER 存储的用户,调用saveUser接口会存储在里面
  • ACT_ID_INFO 存储用户的属性信息,setUserInfo接口的时候设置一key,value信息存储在其中
  • ACT_ID_GROUP 存储新创建的Flowable组信息,saveGroup会存储在其中
  • ACT_ID_MEMBERSHIP 用户和组的关系会存在里面,用户和组可以多对多
  • ACT_ID_PRIV 存储可以使用的权限,createPrivilege会新增一条记录
  • ACT_ID_PRIV_MAPPING 存储用户id或组id与权限的映射关系,addGroupPrivilegeMapping或者addUserPrivilegeMapping会新增一台记录
  • ACT_ID_TOKEN 用户相关Token,saveToken会新存储一条记录

# 权限定义

由于拥有其他的权限系统,因此对flowable中的权限模块需要重新定义.

目前的方案是在权限系统数据库连接上新增一个工作流的数据库实例,将工作流系统中需要用的相关表用视图进行替代,目前需要进行视图映射的表结构如下.

  • ACT_ID_USER 用户表 对应权限系统的用户表
  • ACT_ID_GROUP 候选组表 对应权限系统的角色表
  • ACT_ID_MEMBERSHIP 候选组人员关系表 对应角色用户表
  • ACT_ID_PRIV 权限表 对应权限系统的菜单(待定)