写在前面


  • 一直想学习下​​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和流程图片的预览、导出功能,汉化版,后期打算专门做成一个服务。

​设计器​​​搞定了,我们了解下具体的​​概念​​​吧,先了解一下大概的东西,然后我们基于​​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张表,我们熟悉下。

Activiti 入门学习笔记_新星计划_03

​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());

}

Activiti 入门学习笔记_管理类_04

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​​将​​流程定义文件​​的内容部署到计算机。




  • ​RuntimeService​​:Activiti的流程运行管理类。可以从这个服务类中获取很多关于流程执行相关的信息
  • ​TaskService​​:Activiti的任务管理类。可以从这个类中获取任务的信息。
  • ​HistoryService​​:Activiti的历史管理类,可以查询历史信息,执行流程时,引擎会保存很多数据(根据配置),比如流程实例启动时间,任务的参与者, 完成任务的时间,每个流程实例的执行路径,等等。 这个服务主要通过查询功能来获得这些数据。
  • ​ManagementService​​:Activiti的引擎管理类,提供了对 Activiti 流程引擎的管理和维护功能,这些功能不在工作流驱动的应用程序中使用,主要用于 Activiti 系统的日常维护。

BPMN 2.0学习

关于bpmn的学习,这里不多介绍,小伙伴可以移步到我的其他的博客,专门整理了一份笔记。​​BPMN 2.0学习笔记 (基于Activiti实践学习笔记)​​

Activiti7与SpringBoot整合开发

​Activiti7​​​正式版发布后,就已经支持与​​SpringBoot2.X​​版本完全整合开发了。

  1. 引入maven依赖:核心的依赖就是​​org.activiti:activiti-spring-boot-starter​​​,数据库依赖等,pom.xml 文件:​​https://gitee.com/liruilonger/Activiti-Demo/blob/master/pom.xml​
  2. 创建配置文件​​application.yml​​​ ​​https://gitee.com/liruilonger/Activiti-Demo/blob/master/src/main/resources/application.yml​

全部代码

​https://gitee.com/liruilonger/Activiti-Demo.git​

这样基本的框架就搭建好了。准备工作我们已经做完啦,下面就开始进入正题啦

嗯,还在更新中…