SpringBoot Flowable 完美结合,优雅实现工作流!

工作流介绍。
1.1 为什么使用工作流?
在工作中c;或多或少会遇到审批流程类型的业务需求。审批流程可能包括开始->申请->领导审批->老板审批->多个阶段的结束,如果我们用字段定义每个过程阶段(0->开始 1->申请 2->领导审批 3->老板审批 4->结束),虽然可以实现过程操作逻辑,但这样的业务代码逻辑是复杂的。如果审批过程中仍有拒绝操作,还需要添加一个是否拒绝字段,显然,这样做显然是这样实现的c;成本太高而且不利于维护。
解决上述代码逻辑硬写审批流程造成的成本大,不使用维护的缺点,因此,工作流诞生了。
1.2 什么是工作流?
工作流,它是对业务之间的每一步和规则进行抽象和概括的描述。使用特定语言建模业务流程,让它在计算机上运行,并且让计算机进行计算和推进。工作流是复杂版本的状态机。
简单状态。
上图是工作流退化为基本状态机的例子,路人B的状态很简单,站起来->走起来->跑起来->慢下来->站起来,无限循环如果让我们实现路人B的状态切换,所以我们只需要用一个字段来记录路人B的现状。
复杂状态或状态维度增加,状态流通条件极其复杂,也许单纯用字段记录状态的实现方式就不那么理想了。如下图:。
复杂状态。
现在有更多的选择交给路人甲,当路人甲拿到工资时,他将根据余额的大小来判断下一步该怎么做,如果金额小于或等于5000,然后他决定买一个平板如果金额小于或等于10万,然后路人甲决定学习购买理财产品,但如果路人甲获得的余额超过30万,他决定买一辆宝马,但是购买宝马的过程很复杂,路人甲决定同时完成首付和贷款交易。
事实上,这个过程并不是特别复杂c;但到目前为止,到目前为止,已经到目前为止c;用一个字段来表明状态已经不能满足要求了。
工作流解决的痛点在于,解除业务宏观流程与微观逻辑的耦合,让熟悉宏观业务流程的人制定完整的流通逻辑,让专业人士只关心他们应该关心的流程节点,例如,每个人都想一起建造一个超级体育场,路人甲只需要关心他周围的砖是如何堆砌的,而不是整个建筑。
1.3 工作流无法解决的问题。
工作流无法解决无关(前后无关联)的事务。
工作流是一个固定的框架,只需按照这个框架执行流程,但是在某些情况下,他本身并没有流通顺序。
例如:路人丙需要每天学习#xff0c;谈恋爱,玩游戏,它们之间没有相关性,无法建立过程,但是,今天的任务是否完成可以根据每一项完成的状态来决定。c;在这种情况下,我们需要使用CMMN来建模它是专门为这种情况设计的,但是今天我们就不谈这个了c;相反,我们来谈谈BPMN协议。
2BPMN2.0协议。
2.1 BPMN2.0协议是什么?
业务建模,我们需要一种通用语言来描述,这将降低沟通和实现的难度,就像中英文一样BPMN2.是一种国际通用的建模语言,他能让自然人轻松阅读#xff0c;计算机可以更好地分析。
2.2 BPMN2.0协议元素介绍。
协议中的元素主要分为,事件-任务-连线-网关。
一个过程必须包含一个事件(如:开始事件)和至少一个结束(事件)。其中,网关的作用是控制流程流通逻辑。任务分为多种类型,他们各司其职,所有节点都由连接连接。
下面我简单总结一下每种类型节点的作用。
网关:
互斥网关(Exclusive Gateway),也叫排他网关他只有一个有效的出口,可以理解为if...else if... else if...else,就像我们通常写代码一样。
并行网关(Parallel Gateway),他所有的出口都将被执行,多线程同时执行多个任务是可以理解的。
包容性网关(Inclusive Gateway),符合条件的出口将执行,可以理解为 if(...) do, if (...) do, if (...) do,所有的条件判断都是同级别的。
任务:
BPMN2.0协议的所有任务实际上都来自抽象任务,抽象任务包括以下行为:
当流程转移到任务时,,应该做些什么?f;
当任务获得信号时(signal),能否继续向下流转我们称之为Trigger,任务获取信号的动作。
使用上述抽象行为,让我们解释一些常见且具有代表性的任务类型。
人工任务(User Task),它是一种使用多的任务类型,它有一些人工任务的变量,例如,签收人(Assignee),签收人代表谁处理任务,我们也可以通过特定或一系列特定的签收人找到待办任务。使用上述行为解释是,到User的时候 Task节点,设置Assigneee变量或等待设置Assigneee变量当任务完成时,我们使用Triger要求流程引擎退出任务,继续流转。
服务任务(Service Task),当任务到达时,将执行自动逻辑并自动流通。在这里,我们可以从“到达自动执行逻辑”中找到,想象服务任务的空间可以很大,我们可以执行一段计算执行发送邮件RPC调用执行HTTP调用应用最广泛c;因为HTTP是使用最广泛的协议之一,它可以解决大多数第三方调用问题,在我们的使用中,作为一个特殊的任务节点,HTTP服务任务也被我们单独剥离。
接受任务(Receive Task),这个任务的名字令人费解,但它也是最简单的任务,当任务到达时,它不做任何逻辑,相反,被动地等待Triger,它的适用场景通常是一些不明确的阻塞,例如:复杂的计算需要等待许多条件,这些条件需要人工判断是否可以执行,而不是直接执行此时如果工作人员判断可以继续,然后Trigger让它流通。
调用活动(Call Activity),调用可以理解为函数调用,它将引用另一个流程作为子流程运行,调用活动与函数调用功能相同,模块化过程增加复用的可能性。
上面大概介绍了常用的节点,下图显示了基于BPMN2.0的流程模型,尽量覆盖所有介绍的节点。
这是一个生产手机的过程,从“手机设计”节点到“批准生产”节点是一项串行任务,审批结果会遇到互斥网关,上面说过互斥网关只需要满足其中一个条件就可以流通,这里表达的意义是审批是否通过。
“加载图纸”是一项服务任务,它是自动执行的,之后会卡在“等待原材料”节点,因为这个节点需要人工判断(例如,原材料价格上涨#xff09原材料不足等因素;,因此,Triger需要在自定义条件下进行c;图纸的条件应该是“足够的原材料”,原材料充足后,我们将开始并行生产手机零件。
需要注意的是,,图中并行网关成对出现,他的角色是开始一系列并行任务,等待并行任务一起完成。
2.3 BPMN2.0协议如何使用?
首先,从用户的角度来看,其实用户只需要关心三件事。
如何将我的业务逻辑转化为流程图——一个易于理解的绘图工具。
如何使流程流通——即开箱即用的API。
我需要引擎告诉我我现在应该处理什么节点——丰富而独特的事件机制。
图中是流程图的整个生命周期,从绘图到部署然后启动流程,流程以人工或自动的方式流动,最后结束。
3Flowable简介。
3.1 什么是Flowable?
BPMN2.Java版本的实现协议c;是Java编写的轻量级业务流程引擎。Flowable流程引擎部署BPMN 2.0流程定义(XML标准)用于定义流程;, 创建这些流程定义的流程实例,查询,相关数据,访问运行中或历史的流程实例c;等等。
在Java应用程序中,Flowable可以嵌入运行,也可作为服务器,集群运行,更能提供云服务。
3.2 Flowable和Activiti。
基于Activiti-6.0的Flowable.0.Beta4分支开发。Flowable已经修复了Activiti6中的许多bug,零成本从Activiti迁移到Flowable是可以实现的。
4Flowable实战。
假设公司产品有新的需求,您需要设计员工请假流程的功能。如何设计#xff1f;
我会用flowable来实现。
创建springboot项目(flowable-ui),该项目启动flowable-ui网站,流程绘图设计在当地进行。flowable安装-ui,启动服务进入folwable-ui网站绘图#xff0c;导出图对应xml文件 (画图)。
创建springboot项目(flowable),项目启动过程应用,将相应的xml文件复制到resources下的processes文件夹(processes文件夹需要自己创建) (部署)。
启动springbooot项目 (启动)。
通过接口调用启动流程 (流转)。
4.1 本地安装启动flowable启动flow-ui。
创建 springboot(flowable-ui)项目 项目目录。
JavaSkilPointaplication文件。
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class JavaSkillPointApplication { public static void main(String[] args) { SpringApplication.run(JavaSkillPointApplication.class, args); }}。
application.yml文件。
server: port: 808flowable: idm: app: admin: # 登录用户名 user-id: admin # 登录的密码 password: admin # 用户的名字 first-name: wei last-name: kaispring: # mysql连接信息 datasource: # mysql8之后 driver-class-name: com.mysql.cj.jdbc.Driver # 在mysql8之前# driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://43.143.132.109:3306/flowable?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT&nullCatalogMeansCurrent=true username: root password: 。
(责编:人民网)
分享让更多人看到