Activiti 入门学习笔记

举报
山河已无恙 发表于 2022/03/07 15:13:32 2022/03/07
【摘要】 写在前面一直想学习下Activiti,自己之前工作的时候尝试了很多次,但都失败了,因为之前的工作就是做工作流的,但是旧项目是自己通过状态值驱动流程的,维护困难,新的平台使用了Activiti5,但是是基于低代码平台,都封装好了,所以我也不知道具体是个啥情况,蹭现在离职了,来之不易的时间,学习一波。哈哈BPMN设计器(Activiti Modeler)的问题:因为IDEA版本的问题,设计器弄...

写在前面


  • 一直想学习下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.x5.x两个大的版本,目前最新的版本是 Activiti Cloud7.1.0-M11

     Activiti 是由 jBPM 的创建者 Tom Baeyens 离开 JBoss 之后建立的项目,构建在开发jBPM版本14时积累的多年经验的基础之上,旨在创建下一代的 BPM 解决方案。

     他可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义。业务流程按照预先定义的流程执行,整个实现流程完全由activiti进行管理,从而减少业务系统由于流程变更进行系统改造工作量,从而减少系统开发维护成本,提高系统的健壮性。所以使用Activiti,重点就是两个步骤,首先使用BPMN定义流程,然后使用Activiti框架实现流程

建模语言BPMN

     谈到BPMN,首先就要谈BPMBPMBusiness Process Managemenet业务流程管理。是一种规范化的构造端到端业务流程,以持续的提高组织业务效率。在常见的商业管理教育EMBA、MBA中都包含了BPM的课程。

     有了BPM的需求,就出现了BPM软件。他是根据企业中业务环境的变化,推进人与人之间人与系统之间以及系统与系统之间整合调整经营方法域解决方案的IT工具。

     通过对企业业务流程的整个生命周期进行建模自动化管理监控优化,使企业成本降低,利润得到提升。BPM软件在企业中应用非常广泛,凡是有业务流程的地方都可以使用BPM进行管理。比如企业人事办公管理、采购流程管理、公文审批流程管理、财务管理等。

     而BPMNBusiness 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版本完全整合开发了。

  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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。