BPMN 工作流的名词解释:https://www.flowable.com/open-source/docs/bpmn。可以在线绘制流程图并下载的网站:
Activiti、Flowable、Camunda
有关这三个工作流框架的渊源,网上有很多的资料可以参考。主要因开发者的意见不合而先后建立,想要了解这段故事可以自行查找资料。这几个工作流都是使用 xml
文件来描述流程信息的。
BPMN 2.0 是用于业务流程建模的图形化方法,它定义了一组符号和规则,用于描述整个业务流程的各部分内容,它的目的就是提供一种统一的、易于理解的格式来表示业务流程。
截至本文发文,这几个工作流框架的最新版本基本都不提供内置的页面绘制工具(流程设计器)了,需要额外下载官方提供的工具(Modeler)或者注册登录官方平台免费绘制下载使用,也可以直接去 BPMN提供的网站 绘制并下载使用,都是可以的。三款产品目前都在努力进行商业化,积极为云环境做准备。
基础知识
BPMN (Business Process Model and Notation)
BPMN是一种业务流程建模语言,用于描述和定义业务流程的控制流、数据流和资源分配。它提供了一套标准化的符号和规则来描述业务流程,方便业务分析师和开发人员理解和实施业务流程。
核心概念
流程(Process):一个流程是指一系列的活动和事件,按照特定的顺序执行,以实现特定的业务目标。
活动(Activity):一个活动是指流程中的一项任务或操作,例如填写表格、审批等。
事件(Event):一个事件是指流程中发生的某件事情,例如接收到请求、完成任务等。
网关(Gateway):一个网关是指流程中用来控制流程流向的元素,例如分支、合并等。
泳道(Lane):一个泳道是指流程中用来组织活动和事件的元素,例如部门、角色等。
CMMN (Case Management Model and Notation)
CMMN 是一种案例管理建模语言,用于描述和定义非结构化或半结构化的业务过程。它提供了一套标准化的符号和规则来描述案例管理流程,方便业务分析师和开发人员理解和实施案例管理。
案例管理是一种标准,它允许对可能以不可预测的顺序执行的不同类型的活动进行建模。在早期,我们通常试图通过拥有极其复杂的 BPMN 图来解决案例管理和 BPM 的问题,其中包含所有可能正确的事情和所有可能出错的事情。但实际上,这不是 BPMN 的工作:BPMN 的工作是有一条从头到尾的路径,这条路径非常清晰,能够被理解,并且每次都以相同的方式工作。
案例管理使我们能够避免每次都以相同的方式工作。例如,可以将流程嵌入到案例中,但总的来说,这是一个非常有趣的新领域,它已经存在了一段时间,但采用速度相当快,现在案例管理也正在实现自动化。
核心概念
案例(Case):一个案例是指一个特定的业务场景或问题,例如客户投诉、保险索赔等。
阶段(Stage):一个阶段是指案例管理流程中的一个阶段,例如接收、处理、关闭等。
任务(Task):一个任务是指案例管理流程中的一个具体任务,例如填写表格、审批等。
决策(Decision):一个决策是指案例管理流程中的一个决策点,例如是否批准、是否拒绝等。
DMN (Decision Model and Notation)
DMN 是一种决策建模语言,用于描述和定义决策逻辑和规则。它提供了一套标准化的符号和规则来描述决策流程,方便业务分析师和开发人员理解和实施决策。
它结合了决策表等的旧思想,具有许多高级和新的工具和思想,例如关系表、可重用的业务知识模块和知识源文档等。这些可以用作可堆肥应用程序中的服务组件的决策。我们看到的是,DMN 不仅连接到 BPMN 中的规则和决策任务,而且还取代了许多组织中专有的非标准(标准很重要)业务规则管理系统。
核心概念
决策(Decision):一个决策是指一个特定的决策点,例如是否批准、是否拒绝等。
决策表(Decision Table):一个决策表是指一个表格,用于描述决策逻辑和规则。
输入数据(Input Data):输入数据是指决策流程中使用的数据,例如客户信息、订单信息等。
输出数据(Output Data):输出数据是指决策流程的结果,例如批准或拒绝等。
代码未动,概念先行
会签:一个节点有多个审批人,需要所有审批人都同意或者半数以上的人同意(这个比例在流程绘制时可以控制)才能进入下一个节点;
或签/非会签:一个节点有多个审批人,任一审批人同意即可进入下一节点;
加签:在节点中添加审批人;
减签:在节点中去除审批人;
任务表单:任务发起时需要填写的信息表单;可以理解为请假单、报销单、审批单等需要填写的内容;
流程定义:一个完成的工作流程,简单理解为一个 xml 文件,该文件定义了流程的具体实现,使用 bpmn 2.0 定义的符号绘制。搭配 任务表单 使用;
流程定义版本:每次修改流程定义,对应的流程定义版本 +1;
流程实例:发起人根据流程定义发起具体任务,填写对应的内容并提交,一个任务对应单个或者多个实例;
路由表单:自己编写的前端页面;
在线表单:使用一些绘制工具(vForm 等),在平台使用拖拉拽方式编辑布局,使用表达式或者变量自行设计的表单;
Flowable7
本文只描述 Flowable 7.x 与 Spring Boot3 的集成,其实和以前的方式几乎一样。Flowable 7.x 是目前最新的版本,专注于 Spring Boot 3、Spring 6 和 Java 17 的升级。
Flowable 7 开始,删除了内置的 web ui 流程设计器,官网推荐注册一个账号,免费在官网进行流程绘制,然后下载导入程序。
引入依赖
1 | <dependency> |
配置文件:
1 | spring: |
如果是多数据源,且对数据源的重写程度较大,那么 flowable 可能不会读取配置,程序启动时还是使用内置的 h2 数据库,如果有无法建表的错误,大概率是此原因。
配置文件:
1 | # flowable 配置 |
读取 flowable 的配置:
1 |
|
设置数据源:
1 |
|
但是上面的解决办法会引入新的问题:数据源切换事务可能会出问题,不过由于目前没有用到多数据源(采用的框架支持),所以没有深入。
表说明
flowable 启动时如果数据库没有相关的表结构会自动创建,一共有 70 张表,根据表前缀分类大致如下:
ACT_RE_:RE 代表 repository(存储)。这些表包含静态信息,如流程定义和流程的资源(图片、规则等)。RepositoryService 接口操作的表。
ACT_RU_:RU 代表 runtime。这些表存储运行时信息,如流程实例、用户任务、变量、作业等。Flowable 只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录,以保证运行时表小且快。RuntimeService 接口操作的表。
ACT_HI_:HI 代表 history。这些表存储历史数据,如已完成的流程实例、变量、任务等。HistoryService 接口操作的表。
ACT_ID_:ID 表示 identity(组织机构)。这些表包含标识的信息,如用户、用户组等。IdentityService 接口操作的表。
ACT_GE_:通用数据表,用于存储各种情况下都可能需要的数据。
核心表:
ACT_GE_BYTEARRAY:二进制数据表,用于存储流程定义、流程模板、流程图的图片等
ACT_RE_DEPLOYMENT:记录部署操作的表,一次部署操作对应一条记录
ACT_RE_PROCDEF:流程定义表,一次部署可以部署多个流程,一个流程对应一条记录
ACT_RU_TASK:存储运行中流程的任务节点信息,常用于查询人员或部门的待办任务。
ACT_RU_EXECUTION:运行时流程执行实例表,记录运行中流程运行的各个分支信息。
ACT_HI_PROCINST:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例)。
上面已经说了几个接口,但除此之外,Flowable 还有几个 bean 来进行流程操作。这些 bean 可以直接使用 IOC 注入使用(前提是使用引入的 starter),也可以使用 ProcessEngine#getXXX 的方式获取:
1 | ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); |
常用的网关分类
排他网关(Exclusive Gateway)
定义: 排他网关根据条件表达式来决定激活哪一条流程路径。它会评估离开网关的每个流的条件,如果条件为真,则激活该流。与包含网关不同,排他网关只会激活一个流。
行为: 当流程到达排他网关时,网关会根据条件表达式来决定哪一条流程路径应该被激活。它只会激活一个离开它的流。
使用场景: 需要根据条件选择执行多个任务或活动,但只能选择一个任务执行的场景。
并行网关(Parallel Gateway)
定义: 并行网关允许流程在同一时刻沿着多条路径同时继续执行。它不评估条件,即所有到达并行网关的流都会被激活,并且所有离开网关的流都会被激活。
行为: 当流程到达并行网关时,网关会激活所有离开它的流,允许流程同时沿着这些路径继续执行。并行网关通常用于将单一流程分割成多个并行执行的分支,也可以合并多个并行执行的分支。
使用场景: 需要同时执行多个任务或活动的场景。
包含网关(Inclusive Gateway)
定义: 包含网关根据条件表达式来决定激活哪些流程路径。它会评估离开网关的每个流的条件,如果条件为真,则激活该流。与并行网关不同,包含网关可能只激活一个或多个流。
行为: 当流程到达包含网关时,网关会根据条件表达式来决定哪些流程路径应该被激活。它可以激活一个或多个离开它的流,但不保证所有离开它的流都会被激活。
使用场景: 需要根据条件选择执行多个任务或活动,但不需要所有任务都必须被执行的场景。
事件网关(Event Gateway)
定义: 事件网关是基于事件的网关,它等待特定的事件发生后才会激活流程的下一步。事件网关不需要流程流到达它,而是等待特定事件的触发。
行为: 事件网关在等待特定事件发生时处于等待状态。一旦事件发生,它会激活流程的下一步。事件网关通常用于处理外部事件或异步事件。
使用场景: 需要等待外部事件或异步事件触发后才继续执行流程的场景。
除了上面的几种网关分类之外,还有其它的网关,例如:信号网关、事件基于网关、并行网关的合并等。
接入自己系统的组织架构和人员
我们经常会有这样一种情况,我们已经存在的系统需要接入 flowable,那么我们基本不会使用内置的组和成员,而是需要接入自己系统的组织和人员。