还不了解工作流吗(基础篇)?

本篇我们主要是简单介绍工作流相关知识,如果学习flowable原理请直接到:XXXXXX

之前工作中未接触到工作流相关知识,最近项目中用到工作流系统(flowable框架),借此机会深入学习下flowable(由于项目中使用的是工作流(决策流和案例流有机会再介绍),因此以工作流模型为例,框架使用的是flowable)。

1、概述

Flowable是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准)。flowable可以创建这些流程定义的流程实例,并进行查询、访问运行中或历史的流程实例与相关数据。

1.1、为什么要用工作流

在日常生活工作中,或多或少都会遇见审批流程类型的业务需求。比如休假申请(开始->提交申请->领导审批->驳回/通过->结束),当没有工作流时我们需要定义不同的字段来标识各个阶段含义,当审批是多级或者动态时无法通过增加字段来解决问题(当然,通过暴力增加字段也是可行),为了解决上述硬编码实现审批流程而导致成本高,不利用维护的缺点,工作流因此而生。

1.2、什么是工作流

工作流,是把业务之间的各个步骤以及规则进行抽象和概括性的描述。使用特定的语言为业务流程建模,让其运行在计算机上,并根据用户的行为让计算机进行计算和推动。

工作流解决的痛点在于,解除业务宏观流程和微观逻辑的耦合,让熟悉宏观业务流程的人去制定整套流转逻辑,而让专业的人只需要关心他们应当关心的流程节点。

1.3、框架对比

1.4、模型语言支持

1.4.1、BPMN(Bussiness Process Model Notation)

BPMN(业务流程管理和符号,简称:工作流)是一种流行的业务流程建模语言。它是为业务流程建模而设计的,用于支持业务流程管理,包括分析、设计、优化和实施。通过提供易于理解的、视觉化的图形表示法,使得非技术性的业务人员也能很好地理解业务过程。

官网:www.omg.org/spec/BPMN/2...

1.4.2、CMMN(Case Management Model Notation)

CMMN(案例管理模型和符号)是一种图形化表示法,用于建模和管理复杂、动态和不可预见的业务流程。与BPMN侧重于定义结构化、可预测的流程不同,CMMN专注于灵活和非结构化的工作流程,通常这些流程需要根据具体情况动态调整。

1.4.3、DMN(Decision Model and Notation)

DMN(决策模型标记, 简称:决策流)是一种标准化的图形表示法,用于描述和建模业务决策。DMN的目标是使业务分析师和技术开发者能够协作定义和管理业务规则和决策逻辑,确保决策过程透明、可理解和可执行。

官网:docs.camunda.org/manual/7.22...

2、简介

Flowable可以十分灵活地加入你的应用/服务/构架。可以将JAR形式发布的Flowable库加入应用或服务,来嵌入引擎。 以JAR形式发布使Flowable可以轻易加入任何Java环境:Java SE;Tomcat、Jetty或Spring之类的servlet容器;JBoss或WebSphere之类的Java EE服务器,等等。 另外,也可以使用Flowable REST API进行HTTP调用。也有许多Flowable应用(Flowable Modeler, Flowable Admin, Flowable IDM 与 Flowable Task),提供了直接可用的UI示例,可以使用流程与任务。所有使用Flowable方法的共同点是核心引擎。核心引擎是一组服务的集合,并提供管理与执行业务流程的API。

2.1、基础概念

我们从流程定义和框架组成部分来初步认识flowable。

2.1.1、BPMN2.0流程定义

flowable目前大都使用BPMN2.0协议作为流程定义的标准,因此学习下协议的常用组成元素:

2.2、组成部分

我们可以从两个方面来认识 flowable 的组成。其一,底层数据表。深入了解底层数据表能够让我们迅速把握 flowable 的基础架构。其二,框架提供的核心 API。借助核心 API,我们能够快速洞悉 flowable 的核心能力。

2.2.1、数据表
表分类 表名 解释
流程历史记录
ACT_HI_ACTINST 历史的流程实例
ACT_HI_ATTACHMENT 历史的流程附件
ACT_HI_COMMENT 历史的说明性信息
ACT_HI_DETAIL 历史的流程运行中的细节信息
ACT_HI_ENTITYLINK 历史参与的人员表
ACT_HI_IDENTITYLINK 历史的流程运行过程中用户关系
ACT_HI_PROCINST 历史的流程实例
ACT_HI_TASKINST 历史的任务实例
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 记录用户的token信息
ACT_ID_USER 用户表
流程定义表
ACT_RE_DEPLOYMENT 部署单元信息
ACT_RE_MODEL 模型信息
ACT_RE_PROCDEF 已部署的流程定义
运行实例表
ACT_RU_ACTINST act_ru_actinst相比于act_ru_taskinst数据更全一些,为记录工作流中的所有活动(包括开始、任务、结束等)
ACT_RU_EVENT_SUBSCR 运行时事件
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_IDENTITYLINK 运行时用户关系信息,存储任务节点与参与者的相关信息
ACT_RU_ENTITYLINK 存储实例的父子关系的信息
ACT_RU_JOB 运行时作业
ACT_RU_TIMER_JOB 定时作业表
ACT_RU_SUSPENDED_JOB 运行时暂停作业
ACT_RU_EXTERNAL_JOB 异步作业表(Flowable 引擎使用作业表来实现异步逻辑、计时器或历史处理)
ACT_RU_HISTORY_JOB 当前流程所有历史执行的任务,但是因为如果流程结束,就查不到这些任务所以虽然是历史,但是也命名成了act_ru。
ACT_RU_DEADLETTER_JOB 运行时挂起作业
ACT_RU_TASK 运行时任务
ACT_RU_VARIABLE 运行时变量表
表单
ACT_FO_FORM_DEFINITION 表单定义表
ACT_FO_FORM_DEPLOYMENT 表单部署表
ACT_FO_FORM_INSTANCE 表单实例表
ACT_FO_FORM_RESOURCE 表单源数据表
引擎存储和应用部署
ACT_APP_APPDEF 应用程序定义
ACT_APP_DEPLOYMENT 应用程序部署信息
ACT_APP_DEPLOYMENT_RESOURCE 应用程序部署资源
一般数据
ACT_GE_BYTEARRAY 通用的流程定义和流程资源(二进制格式)
ACT_GE_PROPERTY 系统相关属性
CMMN相关
ACT_CMMN_CASEDEF CMMN的定义
ACT_CMMN_DEPLOYMENT CMMN的部署
ACT_CMMN_DEPLOYMENT_RESOURCE CMMN相关资源
ACT_CMMN_HI_CASE_INST CMMN引擎启动的实例
ACT_CMMN_HI_MIL_INST 每个里程碑的数据
ACT_CMMN_HI_PLAN_ITEM_INST 计划项的数据
ACT_CMMN_RU_CASE_INST 已启动但尚未完成的实例的条目
ACT_CMMN_RU_MIL_INST 实例的一部分达到的每个里程碑的条目
ACT_CMMN_RU_PLAN_ITEM_INST 实例执行期间创建的每个实例的条目
ACT_CMMN_RU_SENTRY_PART_INST 存储哨兵
DMN相关
ACT_DMN_DEPLOYMENT DMN的部署表
ACT_DMN_DEPLOYMENT_RESOURCE DMN的资源表
ACT_DMN_DECISION 已部署决策表的元数据,来自其他引擎的定义相对应
ACT_DMN_HI_DECISION_EXECUTION 有关 DMN 决策表执行的审计信息
2.2.2、框架api

这是flowable官网的核心api

核心api 名称 介绍
ProcessEngine 流程引擎 ProcessEngine可以使用多种方式创建。使用ProcessEngine,可以获得各种提供工作流/BPM方法的服务。ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。
RuntimeService 流程运行服务 用于启动流程定义的新流程实例,也用于读取与存储流程变量,还可以用于查询流程实例与执行(Execution)。最后,还可以在流程实例等待外部触发时使用RuntimeService,使流程可以继续运行
RepositoryService 存储服务 这个服务提供了管理与控制部署(deployments)与流程定义(process definitions)的操作
TaskService 任务服务 所有任务相关的东西都组织在TaskService中(转签、完成、拒绝等)
ManagementService 管理服务 通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。Flowable中很多地方都使用作业,例如定时器(timer),异步操作(asynchronous continuation),延时暂停/激活(delayed suspension/activation)等等
IdentityService 用户组管理服务 它用于管理(创建,更新,删除,查询......)组与用户
HistoryService 历史服务 当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。这个服务主要提供查询这些数据的能力。
FormService 表单服务 这个服务引入了开始表单(start form)与任务表单(task form)的概念,我们可以在流程实例流转期间动态获取数据
DynamicBpmnService 动态修改流程定义服务 可用于修改流程定义中的部分内容,而不需要重新部署它

3、使用指导

3.1、流程设计及部署

流程设计有两种方式

  • 一种是使用IDEA插件画好后导出bpmn文件到指定目录,服务启动时自动加载。
  • 一种是使用flowable自带的flowable-ui项目,但需要自己部署。

3.1.1、flowable-ui

因为saas化项目中,用户自定义流程时肯定需要flowable-ui,因此我们使用flowable-ui(其实项目中使用的wflow,是升级版flowable-ui,但底层核心逻辑还是flowable-ui)。

1.下载地址(自行选择版本,这里使用的是6.7.2)
github.com/flowable/fl...

2.解压

解压之后会获取到flowable-rest.war和flowable-ui.war(修改数据库,修改每个应用WEB-INF/classes/文件夹下的application.properties)

3.部署

将上述两个war包部署到Tomcat的webapps目录下,启动Tomcat

4.访问

通过页面设计流程并部署 访问地址:http://localhost:8080/flowable-ui

3.2、流程操作相关

项目中使用的springboot,因此直接引入starter包。

1.引入maven坐标

xml 复制代码
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>

2.代码开发

可根据自己定义的变量(通过、拒绝)进行相关逻辑操作

在处理任务时,我们可能需要流程实例的参数或者当前任务的参数,我们可以通过RuntimeService、TaskService等api参数获取流程或任务的上下文数据,进而进行一些逻辑操作。(几乎我们想要的数据都可以拿到)

3.验证

使用POSTMAN 调用接口进行发起流程

在【act_ru_actinst】中添加了两条记录

在【act_ru_task】中添加了一条正在运行的记录

使用POSTMAN处理申请人节点自动通过,才会流转到审批人

使用POSTMAN 模拟老板审批=

流程结束后【act_hi_procinst】有一条完整的历史记录,这里面有开始时间、结束时间、时长等信息

上面流程中展示了常用作业务逻辑处理的几张表,其他表里面的数据也会随着流程的变化而变化,这里不再具体细讲,具体处理逻辑需要结合自己的业务场景。

4、总结

flowable是一个比较经典的框架,非常值得我们学习研究,大部分的业务审批、业务流转等流程基础都是使用flowable。通过简单的示例,认识flowable相关表及相关字段,为后续的深入研究打一个基础。

相关推荐
盖世英雄酱5813622 分钟前
🚀不改SQL,也能让SQL的执行效率提升100倍
java·数据库·后端
Java技术小馆32 分钟前
Cursor链接远程服务器实现项目部署
java
用户05956611920938 分钟前
深入理解Spring Boot框架:从基础到实践
java·spring·编程语言
晴空月明44 分钟前
JVM 类加载过程与字节码执行深度解析
java
掉鱼的猫1 小时前
Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛
java·openai·mcp
带刺的坐椅2 小时前
Solon AI + MCP实战:5行代码搞定天气查询,LLM从此告别数据孤岛
java·mcp·solon-ai
androidwork2 小时前
嵌套滚动交互处理总结
android·java·kotlin
草履虫建模3 小时前
Tomcat 和 Spring MVC
java·spring boot·spring·spring cloud·tomcat·mvc·intellij-idea
枣伊吕波3 小时前
第十三节:第七部分:Stream流的中间方法、Stream流的终结方法
java·开发语言
天天摸鱼的java工程师3 小时前
Kafka是如何保证消息队列中的消息不丢失、不重复?
java·后端·kafka