一文带你快速入门Activiti7工作流引擎
之前接到过一个需求,为某公司内部系统设计一个工作流引擎来解决公司内部的各种自动化流程审批业务。当时,就在想,对于流程审批来说,每个申请必然会存在复杂的流程,而每个流程又会需要多方的参与来完成。比如一个员工的请假申请,首先需要部门领导审批、其次是人事审批,最后是总经理审批,这个流程只有完成这三步,请假才算是申请成功。可想而知,这样的流程处理的功能,在我们的后台系统中是非常常见的,那么有没有一个框架,能帮我们解决流程处理方面的问题呢?答案是肯定的,那就是我们今天介绍的Activiti框架。
工作流定义
在介绍Activiti框架之前,先跟大家聊一聊工作流。什么是工作流?工作流是将一组任务组织起来,目的是为了完成某个有序的过程。这个过程定义了任务的触发条件和触发顺序,而且每一个任务都可以由一个或多个软件系统或人来完成。简言之,工作流就是业务流程的自动化实现。使用工作流,可以将效率低下的纸质审批、传递审批、一级级的见面审批等传统的流程审批方式,转换为计算机系统的自动化流程审批。审批人只需要登录系统,就能看到他需要审批的业务。整个流程会随着审批人的审批或拒绝等操作,自动地向下流转。以此来提供企业办公的效率。
Activiti起源
在介绍完工作流定义后,带大家来了解Activiti框架的由来。工作流的开源框架Activiti创始者Tom Baeyens在jBoss公司担任JBPM4工作流引擎的首席架构师,在离开jBoss公司后,推出了基于JBPM4工作流引擎的开源框架Activiti。
BPMN建模符号
Activiti框架基于BPM(Bussiness Process Manage)规范,通过BPMN(Bussiness Process Modeling Notation)进行建模。BPMN2.0规范作为一种标准,定义了流程图的标准符号系统,用于对业务流程进行建模。我们来看一些BPMN定义的符号。
这些符号用于表示流程中的关键环节,比如开始流程、结束流程、任务节点、网关节点、事件节点等等。
可以使用这些流程图符号来定义流程图。可以为每个节点指定参数、表达式等,实现对每个节点的控制。
Activiti通过绘制的流程图BPMN文件部署到数据库汇中,生成流程定义信息。再根据流程定义信息创建流程实例,每一个流程实例就是一个审批流程业务。
Activiti框架
在掌握了BPMN相关概念后,来带大家看看Activiti框架的核心工作流程。
Activiti框架的工作流程是通过读取activiti.cfg.xml配置文件来获得工作流引擎,再通过引擎来创建和操作流程实例。在创建流程实例的过程中,Activiti 会根据配置,在数据库中生成25张表。这些表存储了Activiti运行过程中所需要的信息。包括通用数据、历史数据、身份信息、静态数据及运行时数据等。这些数据,也是某一个工作流实例在运转的过程中产生及需要获取的数据,比如一个请假流程,流程的定义、流程实例、流程达到哪个任务节点等数据,都会保存在这些表中。
同时,Activiti为我们提供了操作数据的多个Service,这些Service已封装了操作流程的大部分功能,我们直接拿来使用即可。
Activiti运行流程
Activiti给我们提供了多个Service,让我们可以在不同流程运行的不同阶段来使用,接下来,带大家看下一个流程运行要经历的各个阶段。
整个运行流程如下:
获得ProcessEngine流程引擎
使用RepositoryService部署流程获得流程定义
使用流程定义获得流程实例
使用TaskService进行流程实例的任务操作
完成所有任务节点操作,流程结束
在研究了流程运行的过程之后,接下来我们详细来看,如何使用Java代码完成流程的各个阶段。
绘制流程图
使用idea绘制流程图插件绘制一个简单的请假流程图。
请假流程发起后,需要请假人创建请假申请,然后交由部门领导审批、总经理审批,最后财务审批,这个流程结束。
流程部署
在使用Activiti进行流程管理之前,需要先将绘制好的流程图部署到数据库中。使用RepositoryService进行流程部署,生成流程部署信息和流程定义。其中,流程定义可用于生成流程实例。
涉及的数据库表:
创建流程实例
在进行流程部署时,获得了流程定义。此时还不能够操作流程,因为流程定义只是一个概念,真正的流程内容需要封装在流程实例。也就是使用流程定义来创建流程实例,这个逻辑大家听起来似乎有点熟悉,没错,流程定义和流程实例之间的关系就是“类”和“对象”的关系。怎么样,这么一描述,是不是瞬间就明白了。
一个流程定义可以创建多个流程实例,比如请假申请是一个流程定义,而小明可以创建小明的请假申请,小王可以创建小王的请假申请,小明和小王创建的请假申请就是具体的流程实例。
使用RuntimeService来获得一个流程实例。
创建完流程实例后,整个流程的内容就会在数据库表中得以体现:
任务管理
流程创建后,流程就开始正常工作了。此时按照流程图的设计,流程会进入到指定的任务节点。这些任务节点,可能是用户任务节点,需要用户来完成任务。有的是脚本节点,会自动执行某一段脚本。
执行任务
当前登录系统的用户,通过TaskService来查询自己是否有被指派的任务,如果有,则通过操作来执行任务,让流程继续往下走。
拾取任务
有的时候,也可以是一个候选组里的多个候选人中的某个候选人来主动拾取任务,即A、B、C中的某一人,只要有一人完成该任务,该流程就能继续往下走。比如请假审批中,部门经理或者总经理,只要有一人审批即可,此时部门经理或总经理就是任务候选人,需要主动去拾取任务。
拾取完任务后,该任务才会到被指派人身上,被指派人可以选择执行任务或者归还任务。执行任务的逻辑我们在上面已经介绍了,下面我们看一下被指派人如何不执行任务,而是归还任务。
归还任务:
转交任务
被指派人除了能归还任务外,还能将任务移交给其他人,由指定的人来完成该任务。
结语
在流程定义中所有的任务节点都结束后,该流程实例才算是完成了。怎么样小伙伴们,是不是很简单?只需要按照老师的思路,就能快速掌握Activiti工作流框架的使用。当然,我们目前描述的是一个比较简单的流程审批场景,如果再复杂一些,比如某个环节需要多个人都完成审批才能进入下一个任务,则需要加入网关的操作。还有,怎样在企业中使用Spring和Springboot进行工作流的开发等等相关的内容,我们都已在下面这套课程中为大家完整的呈现,非常推荐大家来学习我们这一套Activiti实战课程,届时你更加清晰的掌握Activiti相关的概念及如何使用。感兴趣的同学可联系在线名师。
猜你喜欢LIKE
相关推荐HOT
更多>>java两个日期比较相差多少天
在Java中,可以使用`java.time`包下的类来比较两个日期之间相差的天数。以下是一个示例代码:importjava.time.LocalDate;importjava.time.tempo...详情>>
2023-06-27 17:19:00find命令查找文件
"find"命令是在Unix、Linux和类似系统中使用的一个非常强大的命令,用于在文件系统中查找文件和目录。它可以根据各种条件进行搜索,并提供了灵...详情>>
2023-06-16 14:00:30如何添加Java环境变量
要添加Java环境变量,请按照以下步骤进行操作:1.打开计算机的控制面板。2.点击"系统和安全"(Windows10及更高版本)或"系统"(Windows7和较早版本...详情>>
2023-06-08 09:31:10随机函数rand怎么使用
rand是一个C++的函数,用于产生一个随机数。以下是使用rand的方法:1.头文件:需要包含stdlib.h或cstdlib头文件以使用rand函数。2.使用rand()函...详情>>
2023-04-20 15:47:10什么是面向对象编程?面向对象有什么特性
面向对象编程(Object-Oriented Programming,OOP)是一种常用的编程范式,它将数据和操作数据的方法组合成一个单独的实体,称为“对象”,并且对...详情>>
2023-03-17 15:30:11Java培训问答更多>>
新Java行业疑惑解答:Java的内存管理是如何工作的?
新java script是什么?为什么要学java script
新java和大数据哪个好?未来哪个职业发展更好
新java培训班多久能学会?培训周期大概多久
新java script和java的区别有哪些?如何区分
新java script的数据类型主要有哪些?怎样学的更快
新c语言与java区别在哪里?去培训机构学哪个比较好
Java面试题库 更多>>
华为外包java面试题-Java实现单链表的逆序
Java程序员面试题
Java面试题及答案
什么是线程的上下文切换?
如何撤销已经推送(push)到远端仓库的提交(commit)信息?
你了解哪些加密算法?
- 北京校区
- 大连校区
- 广州校区
- 成都校区
- 杭州校区
- 长沙校区
- 合肥校区
- 南京校区
- 上海校区
- 深圳校区
- 武汉校区
- 郑州校区
- 西安校区
- 青岛校区
- 重庆校区
- 太原校区
- 沈阳校区
- 南昌校区
- 哈尔滨校区