Activiti7流程引擎 – 基础篇
说到审批,就一定会有流程又称工作流(Workflow)。例如 开始 -> 申请 -> 主管审批 -> 人事审批 -> 结束,就是一个简单业务审批流程,按照某种预定义的规则传递文档、信息或任务的过程,通俗的说流程就是多种业务对象在一起合作完成某件事情的步骤。而在计算机体系中为了把步骤变成计算机能理解的形式就衍生出了流程引擎!在复杂多变的业务场景下,流程引擎能保证我们业务执行的准确性,大大降低我们设计业务的成本,因此市面也出现了Osworkflow、BPM、Activiti、flowable、Camunda等功能强大的流程引擎被各行各业的计算机应用所利用。
在没有专门的工作流引擎之前,我们之前为了实现流程控制,通常的做法就是采用状态字段的值来跟踪流程的变化情况。这样不用角色的用户,通过状态字段的取值来决定记录是否显示。
针对有权限可以查看的记录,当前用户根据自己的角色来决定审批是否合格的操作。如果合格将状态字段设置一个值,来代表合格;当然如果不合格也需要设置一个值来代表不合格的情况。
这是一种最为原始的方式。通过状态字段虽然做到了流程控制,但是当我们的流程发生变更的时候,这种方式所编写的代码也要进行调整。
那么有没有专业的方式来实现流程的管理呢?并且可以做到业务流程变化之后,我们的程序也可以不用改变,依然能自动化的控制流程?答案就是:流程引擎。
本篇文章以开源的Activiti
流程引擎来介绍如何通过计算机技术对业务流程进行自动化的管理,高效准确的完成某种作业!为什么选Activiti
?
常见开源流程引擎对比:
技术组成 | Activiti | jBPM5 |
---|---|---|
数据库持久层ORM | MyBatis3 | Hibernate3 |
持久化标准 | 无 | JPA规范 |
事务管理 | MyBatis机制/Spring事务控制 | Bitronix,基于JTA事务管理 |
数据库连接方式 | Jdbc/DataSource | Jdbc/DataSource |
支持数据库 | Oracle、SQL Server、MySQL等多数数据库 | Oracle、SQL Server、MySQL等多数数据库 |
设计模式 | Command模式、观察者模式等 | |
内部服务通讯 | Service间通过API调用 | O基于Apache Mina异步通讯 |
集成接口 | SOAP、Mule、RESTful | 消息通讯 |
支持的流程格式 | BPMN2、xPDL、jPDL等 | 目前仅只支持BPMN2 xml |
引擎核心 | PVM(流程虚拟机) | Drools |
技术前身 | jBPM3、jBPM4 | Drools Flow |
所属公司 | Alfresco | jBoss.org |
Activiti
是Java
实现了工业领域BPMN2.0
的规范标准框架,老牌、成熟稳定且目前用户众多、社区活跃、趋势较好(使用越来越多)、易于上手,基于Spring、MyBatis常用互联网技术堆栈。(原文链接:https://javaforall.cn/125263.html)
官网地址:https://www.activiti.org/
1、流程引擎
1.1、流程引擎的定义
多种业务对象在一起合作完成某件事情的步骤,把步骤变成计算机能理解的形式就是流程引擎。
1.2、流程引擎系统
流程引擎系统(Process Engine System
)是一个软件系统,它完成流程的定义和管理,并按照在系统中预先定义好的流程规则进行流程实例的执行。流程引擎系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
流程引擎总是以任务(Task
)的形式驱动人处理业务或者驱动业务系统自动完成作业。有了流程引擎之后,我们不必一直等待其他人的工作进度,直白地说,我们只需要关心系统首页的待办任务数即可,由系统提醒当前有多少待办任务需要处理。因此可以自动化实现流程的管理。
1.3、流程引擎的应用
流程引擎应用广泛,在由流程驱动的各种系统中都有应用,例如OA、CRM、ERP、ECM、BI等。在企业应用中还有很多产品或平台集成流程引擎,用来处理系统运行过程中发起的业务流程。
具体应用:
-
关键业务流程:订单. 报价处理. 合同审核. 客户电话处理. 供应链管理等
-
行政管理类:出差申请. 加班申请. 请假申请. 用车申请. 各种办公用品申请. 购买申请. 日报周报等凡是原来手工流转处理的行政表单。
-
人事管理类:员工培训安排. 绩效考评. 职位变动处理. 员工档案信息管理等。
-
财务相关类:付款请求. 应收款处理. 日常报销处理. 出差报销. 预算和计划申请等。
-
客户服务类:客户信息管理. 客户投诉. 请求处理. 售后服务管理等。
-
特殊服务类:ISO系列对应流程. 质量管理对应流程. 产品数据信息管理. 贸易公司报关处理. 物流公司货物跟踪处理等各种通过表单逐步手工流转完成的任务均可应用工作流软件自动规范地实施。
2、Activiti7概述
2.1、Activiti概述
Activiti
是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens
也是JBoss jBPM的项目架构师。
Activiti
是一个工作流引擎, Activit
可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0
进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti
进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
2.2、BPM软件
BPM(Business Process Management
),即业务流程管理,是一种规范化的构造端到端的业务流程,以持续的提高组织业务效率。常见商业管理教育如EMBA、MBA等均将BPM包含在内。
有了BPM规范后,相应的BPM软件也就诞生,BPM就是根据企业中业务环境的变化,推进人与人之间、人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的IT工具。通过BPM软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,使企业成本降低,利润得以大幅提升。
BPM软件在企业中应用领域广泛,凡是有业务流程的地方都可以BPM软件进行管理,比如企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等。
2.3、BPMN
BPMN(Business Process Model AndNotation
)业务流程模型和符号是由BPMI(BusinessProcess Management Initiative
)开发的一套标准的业务流程建模符号,使用BPMN提供的符号可以创建业务流程。
2004年5月发布了BPMN1.0规范.BPMI于2005年9月并入OMG(The Object Management Group对象管理组织)组织。OMG于2011年1月发布BPMN2.0的最终版本。
BPMN 是目前被各 BPM 厂商广泛接受的 BPM 标准。Activiti
就是使用 BPMN 2.0 进行流程建模、流程执行管理,它包括很多的建模符号,比如:
圆圈代表Event
(流程中运行过程中发生的事情),包括开始事件和结束事件。
活动用圆角矩形表示,一个流程由一个活动或多个活动组成。如上图所有元素组成一个.bpmn
文件,称为业务流程模型。Bpmn图形其实是通过xml表示业务流程,使用文本编辑器打开或导出得到就是一个xml文件。
2.4、SpringBoot集成Activiti7
所谓的流程引擎其实就是一堆非常完善的jar包API,业务系统访问(操作)Activiti
的接口,就可以方便的操作流程相关数据,这样就可以把工作流环境与业务系统的环境集成在一起。因此要想学习这些API,我们必须搭建Activiti7
学习环境。
Activiti
运行需要有数据库的支持,支持的数据库有:h2、mysql、oracle、postgres、mssql、db2等。因此事先需要准备好一个数据库环境。
1、使用SpringBoot
初始化向导创建一个工程(版本我们选择2.6.12),并添加如下maven
依赖(activiti也选择最新版本),暂时先引入这些依赖,后面需要什么再引入什么即可。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.12</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.laizhenghua</groupId>
<artifactId>activity</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>activity</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring-boot-starter -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>