Activiti 入门学习笔记
写在前面
- 一直想学习下
Activiti
,自己之前工作的时候尝试了很多次,但都失败了,因为之前的工作就是做工作流
的,但是旧项目是自己通过状态值驱动流程
的,维护困难,新的平台使用了Activiti5
,但是是基于低代码
平台,都封装好了,所以我也不知道具体是个啥情况,蹭现在离职了,来之不易的时间,学习一波。哈哈 BPMN
设计器(Activiti Modeler
)的问题:因为IDEA版本的问题,设计器弄有些麻烦,所以自己网上找了一个轮子做Demo,简单编码,做了一些业务扩展。- 笔记是结合
B站
上的教学视频做的,作为入门。 - 码云上找了一个开源项目,2k的★★,有兴趣的小伙伴可以看看。https://gitee.com/shenzhanwang/Spring-activiti/tree/spring-boot-activiti
世界是意志的,是一個痛苦的世界。—叔本華
Activiti Modeler
简单编码的Activiti Modeler
支持bpmn.xml
和流程图片
的预览
、导出
功能,汉化版
,后期打算专门做成一个服务。
- 码云仓库Activiti Modeler:https://gitee.com/liruilonger/Activiti-Modeler/blob/master/README.md
- 具体的Demo代码:https://gitee.com/liruilonger/Activiti-Modeler.git
设计器
搞定了,我们了解下具体的概念
吧,先了解一下大概的东西,然后我们基于Springboot
Activiti7
搭一个开发环境,那就愉快的开始Activiti7
之旅吧。
Activiti7 学习
一、Activiti7介绍
Activiti
是目前使用最为广泛的开源工作流引擎
,2010年5月就正是启动了。在了解Activiti之前,我们首先要了解下什么是工作流
。
工作流WorkFlow
关于什么是工作流
:就是“业务过程的部分或整体在计算机应用环境下的自动化”
,它主要解决的是使在多个参与者之间
按照某种预定义
的规则
传递文档、信息或任务的过程自动进行
,从而实现某个预期的业务目标
,或者促使此目标的实现
”。 其实说直白一点,就是业务上一个完整的审批(评审)流程
。
例如员工的入职、请假、出差、采购等等、还有一些关键业务如订单申请、合同审核等等,这些过程,都是一个工作流。对于工作流,传统的处理方式往往需要有人拿着各类的文件,在多个执行部门之间不断的审批。而当我们开始用软件来协助处理这一类审批流程时,就开始出现了工作流系统
。工作流系统可以减少大量的线下沟通成本
,提高工作效率
。有了工作流系统之后,才开始出现工作流引擎
。
在没有专门的工作流引擎之前,我们为了实现这样的流程控制,通常的做法都是采用状态字段
的方式来跟踪流程
的变化情况
。例如对一个员工请假请求,我们会定义已申请
、组长已审核
、部门经理已审核
等等这样一些状态
,然后通过这些状态
来控制不同的业务行为
,比如部门经理角色只能看到组长已审核通过的,并且请假天数超过3天的订单等等。这种实现方式实现起来比较简单,也是软件系统中非常常用的一种方式。但是这种通过状态字段
来进行流程控制
的方式还是有他的弊端
。
- 一方面:整个
流程定义
不够清晰
。业务流程是分散
在各个业务阶段中的,从代码的角度非常难以看到整个流程是如何定义的。 - 一方面:当
流程发生变更
时,这种方式编写的代码就需要做非常大的变更。例如从三级审批
要增加为四级审批
甚至是协同审批
,那各个业务阶段的审批流程都需要随之做大量的变更。
正是出于这些痛点,后面才有了工作流引擎
。使用工作流引擎后,整个审批流程可以在同一个地方进行整体设计,并且当审批流程发生变更时,业务程序也可以不用改变。这样业务系统的适应能力就得到了极大提升。
引擎:
其实引擎
的思想无处不在。我们有Drools规则引擎
,可以在程序不发生变动的情况下,集中定义业务规则
并进行修改。Aviator表达式引擎
,可以快速计算某一个表达式的结果。搜索引擎
,可以快速进行统一搜索等等。其核心思想都是将业务之间
的共性抽取
出来,减少业务变动对程序的影响
。
工作流管理系统(Workflow Management System, WfMS)
是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。
工作流管理联盟(WfMC,Workflow Management Coalition)
给出的关于工作流管理系统的定义是:工作流管理系统是一个软件系统,它通过执行经过计算的流程定义去支持一批专门设定的业务流程。工作流管理系统被用来定义、管理、和执行工作流程。
工作流管理系统的目标
管理工作的流程以确保工作在正确的时间被期望的人员所执行——在自动化进行的业务过程中插入人工的执行和干预。
Activiti工作流引擎
Activiti正是目前使用最为广泛的开源工作流引擎
。Activiti
的官网地址是 https://www.activiti.org 历经6.x
和5.x
两个大的版本,目前最新的版本是 Activiti Cloud7.1.0-M11
。
Activiti
是由 jBPM
的创建者 Tom Baeyens
离开 JBoss
之后建立的项目,构建在开发jBPM
版本1
到4
时积累的多年经验的基础之上,旨在创建下一代的 BPM
解决方案。
他可以将业务系统
中复杂的业务流程
抽取出来,使用专门的建模语言BPMN2.0
进行定义。业务流程按照预先定义的流程执行,整个实现流程完全由activiti
进行管理,从而减少业务系统
由于流程变更
进行系统改造
的工作量
,从而减少系统开发维护成本
,提高系统的健壮性
。所以使用Activiti
,重点就是两个步骤,首先使用BPMN定义流程
,然后使用Activiti框架实现流程
。
建模语言BPMN
谈到BPMN
,首先就要谈BPM
。 BPM
即Business Process Managemenet
,业务流程管理
。是一种规范化
的构造端到端
的业务流程
,以持续的提高组织业务效率。在常见的商业管理教育
如EMBA、MBA
中都包含了BPM
的课程。
有了BPM
的需求,就出现了BPM
软件。他是根据企业中业务环境
的变化,推进人与人之间
,人与系统之间
以及系统与系统之间
的整合
及调整
的经营方法域解
决方案的IT工具。
通过对企业业务流程
的整个生命周期
进行建模
、自动化
、管理监控
和优化
,使企业成本降低,利润得到提升。BPM软件在企业中应用非常广泛,凡是有业务流程
的地方都可以使用BPM
进行管理。比如企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等。
而BPMN
是Business Process Model And Notation 业务流程模型和符号
,就是用来描述业务流程
的一种建模标准
。BPMN最早由BPMI(BusinessProcessManagement Initiative)
方案提出。由一整套标准的业务流程建模符号组成。使用BPMN
可以快速定义
业务流程。BPMN最早在2004年5月发布。2005年9月开始并入OMG(The ObjectManagemenet Group)组织。OMG于2011年1月发布BPMN2.0
的最终版本。BPMN是目前被各大BPM
厂商广泛接受的BPM标准
。Activiti
就是使用BPMN2.0
进行流程建模、流程执行管理。整个BPMN
是用一组符号来描述业务流程中发生的各种事件的。BPMN通过在这些符号事件之间连线来描述一个完整的业务流程。
数据库类型 | 版本 | JDBC连接示例 | 说明 |
---|---|---|---|
h2 | 1.3.168 | jdbc:h2:tcp://localhost/activiti | 默认配置的数据库 |
mysql | 5.1.21 | jdbc:mysql://localhost:3306/activiti?autoReconnect=true | 使用 mysql-connector-java 驱动测试 |
oracle | 11.2.0.1.0 | jdbc:oracle:thin:@localhost:1521:xe | |
postgres | 8.1 | jdbc:postgresql://localhost:5432/activiti | |
db2 | DB2 10.1、using、db2jcc4 | jdbc:db2://localhost:50000/activiti | |
mssql | 2008 using、sqljdbc4 | jdbc:sqlserver://localhost:1433/activiti |
表结构解读
从这些刚才创建的表中可以看到,activiti
的表都以act_
开头。第二个部分表示表的用途。用途也和服务的API对应。28张表,我们熟悉下。
ACT_GE
: GE 表示 general。 通用数据, 用于不同场景下.
表名称 | 表含义 |
---|---|
act_evt_log | 事件处理日志表 |
act_ge_bytearray | 通用的流程定义和流程资源 |
act_ge_property | 系统相关属性 |
ACT_HI
:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
表名称 | 表含义 |
---|---|
act_hi_actinst | 历史的流程实例 |
act_hi_attachment | 历史的流程附件 |
act_hi_comment | 历史的说明性信息 |
act_hi_detail | 历史的流程运行中的细节信息 |
act_hi_identitylink | 历史的流程运行过程中用户关系 |
act_hi_procinst | 历史的流程实例 |
act_hi_taskinst | 历史的任务实例 |
act_hi_varinst | 历史的流程运行中的变量信息 |
ACT_ID
:用户的身份信息
表名称 | 表含义 |
---|---|
act_id_group | 身份信息-组信息 |
act_id_info | 身份信息-组信息 |
act_id_membership | 身份信息-用户和组关系的中间表 |
act_id_user | 身份信息-用户信息 |
表名称 | 表含义 |
---|---|
act_procdef_info | 死信任务 |
ACT_RE
:'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。
表名称 | 表含义 |
---|---|
act_re_deployment | 部署单元信息 |
act_re_model | 模型信息 |
act_re_procdef | 已部署的流程定义 |
ACT_RU
:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
表名称 | 表含义 |
---|---|
act_ru_deadletter_job | 执行失败任务表 |
act_ru_event_subscr | 运行时事件 |
act_ru_execution | 运行时流程执行实例 |
act_ru_identitylink | 运行时用户关系信息 |
act_ru_job | 运行时作业 |
act_ru_suspended_job | 运行时暂停任务 |
act_ru_task | 运行时任务 |
act_ru_timer_job | 运行时定时任务 |
act_ru_variable | 运行时变量表 |
Activiti核心类
我们先看一个简单的Demo,学习一下ProcessEngine
这个引擎类
/**
* 添加业务key 到Activiti的表
*/
@Test
public void addBusinessKey(){
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、启动流程的过程中,添加businesskey
// 第一个参数:流程定义的key
// 第二个参数:businessKey,存出差申请单的id,就是1001
ProcessInstance instance = runtimeService.
startProcessInstanceByKey("myLeave", "1001");
// 4、输出
System.out.println("businessKey=="+instance.getBusinessKey());
}
ProcessEngine.java
package org.activiti.engine;
import org.activiti.engine.api.internal.Internal;
/**
* Provides access to all the services that expose the BPM and workflow operations.
* // 提供对公开BPM和工作流操作的所有服务的访问。
* <ul>
* <li>
* <b>{@link org.activiti.engine.RuntimeService}: </b> Allows the creation of {@link org.activiti.engine.repository.Deployment}s and the starting of and searching on
* {@link org.activiti.engine.runtime.ProcessInstance}s.</li>
* <li>
* <b>{@link org.activiti.engine.TaskService}: </b> Exposes operations to manage human (standalone) {@link org.activiti.engine.task.Task}s, such as claiming, completing and assigning tasks</li>
* <li>
* <b>{@link org.activiti.engine.ManagementService}: </b> Exposes engine admin and maintenance operations</li>
* <li>
* <b>{@link org.activiti.engine.HistoryService}: </b> Service exposing information about ongoing and past process instances.</li>
* </ul>
*
* Typically, there will be only one central ProcessEngine instance needed in a end-user application. Building a ProcessEngine is done through a {@link ProcessEngineConfiguration} instance and is a
* costly operation which should be avoided. For that purpose, it is advised to store it in a static field or JNDI location (or something similar). This is a thread-safe object, so no special
* precautions need to be taken.
*
*/
@Internal
public interface ProcessEngine {
/** the version of the activiti library */
public static String VERSION = "7.1.0-M6"; // Note the extra -x at the end. To cater for snapshot releases with different database changes
/**
* The name as specified in 'process-engine-name' in the activiti.cfg.xml configuration file. The default name for a process engine is 'default
*/
String getName();
void close();
// activiti的资源管理类
RepositoryService getRepositoryService();
// activiti的流程运行管理类
RuntimeService getRuntimeService();
// activiti的任务管理类
TaskService getTaskService();
// activiti的历史管理类
HistoryService getHistoryService();
// activiti的引擎管理类
ManagementService getManagementService();
// activiti动态处理 bpmn 模型类
DynamicBpmnService getDynamicBpmnService();
// 创建方法
ProcessEngineConfiguration getProcessEngineConfiguration();
}
-
RepositoryService
:是activiti
的资源管理类
,提供了管理
和控制流程发布包
和流程定义
的操作。使用工作流建模工具设计的业务流程图需要使用此service
将流程定义文件
的内容部署到计算机。- [x] 帮助我们实现流程定义的部署。此服务会处理与流程定义相关的静态数据。
- [x] 查询引擎中的发布包和流程定义。
- [x] 暂停或激活发布包,对应全部和特定流程定义。 暂停意味着它们不能再执行任何操作了,激活是对应的反向操作。获得多种资源,像是包含在发布包里的文件, 或引擎自动生成的流程图。
- [x] 获得流程定义的pojo版本, 可以用来通过java解析流程,而不必通过xml。
-
RuntimeService
:Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息 -
TaskService
:Activiti的任务管理类。可以从这个类中获取任务的信息。 -
HistoryService
:Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。 -
ManagementService
:Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。
BPMN 2.0学习
关于bpmn的学习,这里不多介绍,小伙伴可以移步到我的其他的博客,专门整理了一份笔记。BPMN 2.0学习笔记 (基于Activiti实践学习笔记)
Activiti7与SpringBoot整合开发
Activiti7
正式版发布后,就已经支持与SpringBoot2.X
版本完全整合开发了。
- 引入maven依赖:核心的依赖就是
org.activiti:activiti-spring-boot-starter
,数据库依赖等,pom.xml 文件:https://gitee.com/liruilonger/Activiti-Demo/blob/master/pom.xml - 创建配置文件
application.yml
https://gitee.com/liruilonger/Activiti-Demo/blob/master/src/main/resources/application.yml
全部代码
https://gitee.com/liruilonger/Activiti-Demo.git
这样基本的框架就搭建好了。准备工作我们已经做完啦,下面就开始进入正题啦
- 点赞
- 收藏
- 关注作者
评论(0)