# 使用flowable **Repository Path**: ycfrank/use-flowable ## Basic Information - **Project Name**: 使用flowable - **Description**: 学习使用flowable ,版本6.7.1,部分表有变动 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-26 - **Last Updated**: 2023-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 参考文章 :https://blog.csdn.net/qq_43372633/article/details/130598488 ### 工作流介绍 工作流,是把业务之间的各个步骤以及规则进行抽象和概括性的描述。 使用特定的语言为业务流程建模,让其运行在计算机上,并让计算机进行计算和推动。 工作流是复杂版本的状态机。 ![img.png](img.png) 上图为工作流退化为基础状态机的例子,路人乙的状态非常简单,站起来->走起来->跑起来->慢下来->站起来,无限循环,如果让我们实现路人乙的状态切换,那么我们只需要用一个字段来记录路人乙当前的状态就好了。 而对于复杂的状态或者状态维度增加且状态流转的条件极为复杂,可能单纯用字段记录状态的实现方式就会不那么理想. ![img_1.png](img_1.png) 现在交给路人甲的选择就多了起来,当路人甲获发完工资后的时候,他会根据余额的大小来判断接下来该如何行动,如果数额小于等于5000,那么他决定买一个平板,如果数额小于等于10万,那么路人甲就决定去学习一下购买理财产品,但如果路人甲获得的余额数量超过了30万,他就决定购买一辆宝马,但购买宝马的流程是复杂的,路人甲决定同时完成交首付和贷款的手续。 **其实这个流程还不算特别复杂,但到目前为止,单纯用一个字段来表明状态已经无法满足要求了。** 工作流解决的痛点在于,解除业务宏观流程和微观逻辑的耦合,让熟悉**宏观业务流程的人**去制定整套流转逻辑,而让**专业的人** 只需要关心他们应当关心的流程节点,就好比大家要一起修建一座超级体育场,路人甲只需要关心他身边的这一堆砖是怎么堆砌而非整座建筑。 **工作流无法解决毫无关系(没有前后关联)的事务** ### BPMN2.0协议 对于业务建模,我们需要一种通用的语言来描绘,这样在沟通上和实现上会降低难度,就像中文、英文一样,BPMN2.0便是一种国际通用的建模语言,他能让自然人轻松阅读,更能被计算机所解析。 **协议中元素的主要分类为,事件-任务-连线-网关。** 一个流程必须包含一个事件(如:开始事件)和至少一个结束(事件)。其中网关的作用是流程流转逻辑的控制。任务则分很多类型,他们各司其职,所有节点均由连线联系起来。 下面我就以每种类型的节点简单地概括一下其作用。 #### 网关 - 互斥网关(Exclusive Gateway),又称排他网关,他有且仅有一个有效出口,可以理解为if......else if...... else if......else,就和我们平时写代码的一样。 - 并行网关(Parallel Gateway),他的所有出口都会被执行,可以理解为开多线程同时执行多个任务。 - 包容性网关(Inclusive Gateway),只要满足条件的出口都会执行,可以理解为 if(......) do, if (......) do, if (......) do,所有的条件判断都是同级别的。 #### 任务 BPMN2.0协议的所有任务其实是从一个抽象任务派生而来的,抽象任务会有如下行为: 1.当流程流转到该任务时,应该做些什么? 2.当该任务获得信号(signal)的时候,它是否可以继续向下流转,而任务获得信号的这个动作我们称为Trigger。 利用如上的抽象行为,我们来解释一些比较常见且具有代表性的任务类型。 - 人工任务(User Task),它是使用得做多的一种任务类型,他自带有一些人工任务的变量,例如签收人(Assignee),签收人就代表该任务交由谁处理,我们也可以通过某个特定或一系列特定的签收人来查找待办任务。利用上面的行为解释便是,当到达User Task节点的时候,节点设置Assignee变量或等待设置Assignee变量,当任务被完成的时候,我们使用Trigger来要求流程引擎退出该任务,继续流转。 - 服务任务(Service Task),该任务会在到达的时候执行一段自动的逻辑并自动流转。从“到达自动执行一段逻辑”这里我们就可以发现,服务任务的想象空间就可以非常大,我们可以执行一段计算,执行发送邮件,执行RPC调用,而使用最广泛的则为HTTP调用,因为HTTP是使用最广泛的协议之一,它可以解决大部分第三方调用问题,在我们的使用中,HTTP服务任务也被我们单独剥离出来作为一个特殊任务节点。 - 接受任务(Receive Task),该任务的名字让人费解,但它又是最简单的一种任务,当该任务到达的时候,它不做任何逻辑,而是被动地等待Trigger,它的适用场景往往是一些不明确的阻塞,比如:一个复杂的计算需要等待很多条件,这些条件是需要人为来判断是否可以执行,而不是直接执行,这个时候,工作人员如果判断可以继续了,那么就Trigger一下使其流转。 调用活动(Call Activity),调用活动可以理解为函数调用,它会引用另外一个流程使之作为子流程运行,调用活动跟函数调用的功能一样,使流程模块化,增加复用的可能性。 **如何使用BPMN2.0协议** 首先,从用户的角度来看,使用者其实只需要关心三件事 - 我如何把我的业务逻辑转化为流程图-即容易理解的绘图工具。 - 我如何使流程流转-即开箱即用的API。 - 我需要引擎告诉我,我现在该处理什么节点-即丰富且鲜明的事件机制。 ### Flowable简介 Flowable是BPMN2.0协议的一种Java版本的实现,是一个使用Java编写的轻量级业务流程引擎。Flowable流程引擎可用于部署BPMN 2.0流程定义(用于定义流程的行业XML标准), 创建这些流程定义的流程实例,进行查询,访问运行中或历史的流程实例与相关数据,等等。 Flowable是基于Activiti-6.0.0.Beta4分支开发的。目前Flowable已经修复了Activiti6很多的bug,可以实现零成本从Activiti迁移到Flowable。 Flowable可以嵌入Java应用程序中运行,也可以作为服务器、集群运行,更可以提供云服务。 **设计一个员工请假流程的功能。你该如何设计?** - 创建springboot项目(flowable-ui),该项目是启动flowable-ui网站,在本地进行流程画图设计。安装flowable-ui,启动服务进入folwable-ui网站画图,导出图对应的xml文件 (画图) - 创建springboot项目(flowable),该项目是启动流程应用,将对应的xml文件复制到resources下的processes文件夹中(processes文件夹需自己创建) (部署) - 启动springboot项目 (启动) - 通过接口调用,启动流程 (流转) `我们需要在 resource 目录下创建 processes路径,存放相关的 XML流程配置文件。Flowable 框架会默认加载此目录下的工作流文件并解析 XML,并将解析后的流程配置信息持久化到数据库。` **启动流程流程实例** - 现在已经在流程引擎中部署了流程定义,因此可以使用这个流程定义作为“蓝图”启动流程实例。 - 我们使用RuntimeService启动一个流程实例。 - 收集的数据作为一个java.util.Map实例传递,其中的键就是之后用于获取变量的标识符。 - 这个流程实例使用key启动。这个key就是BPMN 2.0 XML文件中设置的id属性。 - 在这个例子里是StudentLeave。 这两个就是在XML文件钟定义的变量 ```shell flowable:assignee="${studentUser}" ${outcome==‘通过’} ${day <= 2} ``` **flowable数据库说明** Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。 - ACT_RE_* :’ RE ’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。 - ACT_RU_* :’ RU ’表示runtime。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。 - ACT_ID_* : ’ ID ’表示identity(组织机构)。这些表包含标识的信息,如用户,用户组,等等。 - ACT_HI_* : ’ HI ’表示history。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。 - ACT_GE_* : 普通数据,各种情况都使用的数据。 flowable从6.4.1开始,act_de_model代替原来的act_re_model表,act_re_model将作废,大家要注意。