一、认识工作流
1.认识BPM与BPMN
如果我们翻阅Flowable的文档,可以看到对于它会有一段这样的描述-"可用于部署BPMN2.0流程定义",那么BPMN2.0又是个什么东东呢?下面我们简单介绍一下。
要知道BPMN2.0是什么,我们需要先了解下BPM(Business Process Management,业务流程管理)。它说白了就是一种管理方法,或者说是一种思想,主要是用来管理业务流程,我们如今的很多涉及到业务关系和流程的系统都可以称为BPM系统,比如你一定在大学期间做过的图书管理系统当然也属于这一类。
针对复杂的问题,我们通常的解决方法是对其进行模型化的抽象,通过模型来推导解决问题,也就是建模(这一过程也被称之为Business Process Modeling业务流程建模)。BPM下就有很多种建模语言,BPMN(Business Process Modeling Notation)就是其中的一种建模语言。
在BPMN发展的过程中,基于BPMN的一些特性与业务流程管理中常见的一些情况,总结提炼出了一套标准。这套标准或者也可称之为规范,在2004年5月由BPMI Notation Working Group对外发布,这就是BPMN 1.0 规范。后来BPMI并入到OMG组织,并在2011年推出BPMN2.0标准,对BPMN进行了重新定义 (Business Process Model and Notation),这就是我们常说的BPMN2.0。
总的来说,BPM是一种管理思想,而BPMN是实现这种思想的一种工具,它们之间的关系就像是方法论与方法的关系。BPMN作为一种建模语言,可以帮助我们更好地理解和实现BPM的目标。
2.工作流引擎的发展
工作流引擎则可用于部署BPMN 2.0流程定义,创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据。而基于BPMN2.0标准也产生了很多工作流引擎,例如Activiti 、Flowable 、jBPM等。
Flowable功能最全面,Camunda最轻,我的这次系列教程打算使用的是Flowable。
通过这个流程图,我们可以大致了解到主流工作流引擎的发展史。我这个系列将使用的是 Flowable,所以后续的文章都会围绕 Flowable 展开。通过前面的介绍,我们可以把 Flowable 与BPMN的关系理解为:Flowable 是一个工具,它使用BPMN 2.0作为其流程定义的标准,通过解析BPMN 2.0定义的流程图,Flowable 可以创建、管理和执行这些流程。这样,Flowable 就能够帮助我们实现业务流程的自动化管理。
二、流程设计
对工作流引擎有了一定的认识后,我们就需要开始工作流里最重要的一个环节,那就是设计流程。有了设计的流程模型后,我们才可以通过Flowable进行后续的操作。目前流程设计有以下五种方式,大家根据自己的需要选择适合自己需求的方式。
1.FlowableUI(不推荐)
官方出品,与 Flowable 后台引擎逻辑对接非常好,元素及属性也是最全的。但是真的不适合业务中使用,界面不是太友好,参数设置不是很灵活,基本都是输入框,在实际业务场景中,用户看到你这套估计都头晕。并且官方在7.0中也已经移除了这套设计器,鼓励开发者根据规范去定制自己的流程设计器。当然,FlowableUI 也不是一无是处,在学习阶段我认为还是挺好用的,对我们入门学习还是蛮方便的。
2.BPMN.js自定义
当 FlowableUI 无法满足复杂的流程业务需求时,这个时候"大手子"就可以基于bpmn.js来自定义流程设计器。官网地址:bpmn.io/
感兴趣的同学可以参考中文学习文档:https://github.com/LinDaiDai/bpmn-chinese-document
3.第三方的设计器(推荐)
自己从0到1做当然是个很耗费心力的事情,所以直接用别人开源的设计器当然也是不错的选择,如果自己有定制化需求,那从1到10去改也相对容易了。
4.代码实现
这个方法我推荐业务自定义程度不高的同学去使用,直接在后端通过 BpmnModel 对象创建流程。
三、流程图的组成
为了便于读者理解,我这里简单绘制一个请假的流程图进行讲解:
1.事件
事件用于控制流程的执行、任务分配和流程终止等关键操作,比如上图中看到的两个圆圈就分别是开始事件和结束事件。
2.连线
连线定义了流程的流转路径,决定了流程实例如何从一个节点到达另一个节点。比如上图中将其他元素连在一起的线条。
3.任务
任务是流程中的关键组成部分,用于协调和管理流程实例的执行。比如上图中请假的那个节点,在Flowable 中每一个任务都可以配置表单对该任务的相关信息进行配置,例如处理人。
4.网关
网关用于控制流程的流向和分支。不同类型的网关具有不同的作用。常见的网关有排他网关、并行网关、包容网关。在上图中我并没有绘制网关,为了便于大家理解,我辅助说明下,比如在上图请假节点的责任人同意请假或拒绝请假分别有不同的任务流向,就在这个任务后加个网关进行判断,有些类似于代码中的if判断语句,当然这只是一种情况。
四、小结
作为系列文章的开篇,本篇文章主要是帮助读者对工作流引擎建立起一个初步的认识,在后续的篇章中我将使用Flowable帮助各位读者逐步学习如何在SpringBoot中进行整合和应用。