# activiti **Repository Path**: algebra/activiti ## Basic Information - **Project Name**: activiti - **Description**: 工作流入门培训 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-09 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: 学习demo ## README # Activiti流程引擎 ### springboot-activiti使用 #### 项目介绍 流程设计平台 一个完整的工作流生命周期主要有5步: 1、定义:即流程的定义,所有的流程总是从定义开始。主要任务是收集需求并将其转化为流程定义。 2、发布:开发人员将资源打包后在系统平台中发布流程定义,主要任务流程定义文件/自定义表单/任务监听类等。 3、执行:具体的流程引擎按照上面定义的流程处理路线来执行业务。 4、监控:收集每个任务的结果,将根据不同结果来做处理。 5、优化:此时业务流程已经完成,需要的就是优化流程或重新设计等。 #### 软件架构 基于springboot2 和 activiti-5.2 #### 使用说明 - swagger中创建流程 [swagger地址](http://localhost:8181/swagger-ui.html):http://localhost:8181/swagger-ui.html - 根据创建后返回的modelId 进入流程设计界面 [设计地址](http://localhost:8181/modeler.html?modelId=1):http://localhost:8181/modeler.html?modelId=1 ### Activiti介绍 #### 什么是Activiti Activiti是一个针对企业用户、开发人员、系统管理员的轻量级工作流业务管理平台,其核心是使用Java开发的快速、稳定的BPMN2.0流程引擎。Activiti是在ApacheV2许可下发布的,可以运行在任何类型的Java程序中,如:服务器、集群、云服务等。Activiti可以完美的与Spring集成,是基于简约的设计思想而创建。 ##### 了解BMP BPM即`Business Process Management`的缩写,为业务流程管理。是一套达成企业各种业务环节整合的全面管理模式。BPM是一系列逻辑相关的活动的集合,BPM最早是由工作流和企业应用集成融合发展而来,当时是为了满足无纸化办公需求。 ##### 了解BMPN 即`Business Process Modeling Notation`的简称,全称为业务流程建模标注 ,由BPMN标准组织发布,2011年发布到2.0之后,市场常用的都是此版本规范。BPMN定义类业务流程图,其基于流程图技术,同时对创建业务流程操作的图形化模型进行了裁剪。业务流程的模型即图形化对象的网图,包含有活动和定义操作顺序的流程控制。 [官网]: http://www.activiti.org/ "官网" #### Activiti特点 - 数据持久化:Activiti设计思想是简洁与快速。一般情况下系统的瓶颈主要就体现在应用和数据库的交互上,针对这种情况Activiti选择了使用Mybatis,而通过最优SQL语句执行Command。 - 引擎Service接口:Activiti引擎提供了七大Service接口,都是通过ProcessEngine获取,同时支持链式API编程风格。 | Service接口 | 作用 | | :---------------: | :----------------------------------------------------------: | | RepositoryService | 流程仓库Service,用于管理流程仓库,如:部署、删除、读取流程资源 | | IdentifyService | 身份Service,可管理和查询用户、组之间的关系 | | RuntimeService | 运行时Service,处理所有正在运行的任务和流程实例等 | | TaskService | 任务Service,用于管理查询任务,如签收、办理、指派等 | | FormService | 表单Service,用于读取和任务、流程相关的表单数据 | | HistoryService | 历史Service,可查询所有历史数据 | | ManagementService | 引擎管理Service,和具体业务无关,可用查询引擎配置、数据库、作业等 | - 流程设计器:Activiti团队设计了基于BPMN2.0规范的设计器-Eclipse Designer,除此还有Signavio公司为Activiti定制的基于Web的Activiti Modeler流程设计器。 - 原生支持Spring:当前企业开发,基本上都会基于Spring去开发自己的系统,由于Activiti原生支持Spring,所以很轻松地进行Spring集成。 - 分离运行时与历史数据:运行与历史数据的分离,可以加快运行时数据的性能,当需要历史数据时,我们在去查询。 #### Activiti的应用 - 在系统集成方面:与ESB整合 / 与规则引擎整合 / 嵌入已有系统平台(也是本项目的需求) - 在其他产品中应用:Alfresco公司的ECM产品在企业中应用,主要涉及文档管理 / 协作 / 记录管理 / 知识库管理 / Web内容管理等。 #### Activiti框架与组件 Activiti最重要的就是引擎,除此之外就是外部的工具和组件。 | **Modeling** | **Runtion** | **Managemen**t | | ------------------ | --------------- | ----------------- | | Activiti Modeler | Activiti Engine | Activiti Exproler | | Activiti Designer | Activiti Engine | Activiti REST | | Activiti Kickstart | Activiti Engine | Activiti REST | 下面对以上组件进行简单的说明: - Activiti Engine:最核心的模块,提供针对BPMN2.0规范的解析 / 执行 / 创建 / 管理(任务-流程实例) / 查询历史记录并生成相应报表等。 - Activiti Modeler:模型设计器,非Activiti公司开发。用于将需求转换为规范流程定义。 - Activiti Designer:设计器,与Activiti Modeler功能类似。 - Activiti Exproler:用来管理仓库 / 用户 / 组,启动流程 / 任务办理等。 - Activiti REST:提供REST风格的服务,允许客户端以JSON的方式与引擎的REST API交互,协议具有跨平台 / 跨语言。 #### Activiti数据库表格 ![表格总览](./study/work-flow-md/表格总览.png) 说明:`activiti`工作流的表格都是以`act_`开头,主要包含通用数据表(存放二进制文件)、历史记录表、模型部署表、运行时数据表、组织机构表。其中,我们主要使用二进制文件、模型部署和运行时数据表。下面详细介绍主要的表格字段属性: [字段解释](study/workflow-st.md) 默认项目启动之后自动建表。 **ps.**如果启动项目时候无法建表,可以执行如下步骤, `activiti-engine.jar`包中自带了创建`activiti`工作流数据库表的SQL语句和自动初始化数据库的方法。SQL语句在`org.activiti.db.create`包下,初始化方法在`org.activiti.engine.impl.db.DbSchemaCreate`的main方法之中。 在`src/main/resources`下新建文件`activiti.cfg.xml`,文件内容如下: ```xml ``` 启动类`DbSchemaCreate`的`main`方法 ```java public class DbSchemaCreate { public static void main(String[] args) { ProcessEngineConfiguration .createProcessEngineConfigurationFromResourceDefault() .setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_CREATE) .buildProcessEngine(); } } ``` #### 字段解释(一)primaryKey | 名称 | 字段 | 说明 | | :--------: | :------------: | :----------------------------------------------------------- | | 模型key | KEY_ | act_re_model 中的KEY_,作为模型的唯一非主键标识; | | 部署ID | DEPLOYMENT_ID_ | act_re_deployment的主键,模型部署后产生此ID,主要关联模型部署的二进制文件act_ge_bytearray;以及act_re_procdef表 | | 流程定义ID | PROC_DEF_ID_ | act_re_procdef的主键,模型部署后产生,组成方式为模型定义的KEY+版本+自增数字;一旦产生,则后续的流程实例化都要依据此数据(相当于java中的Class的概念);为act_ru_execution的外键; | | 流程实例ID | PROC_INST_ID_ | 与act_ru_execution的主键一致,记录一次实例化后的流程,其表格与act_re_procdef是多对一的关系(相当于由Class实例化了的对象们);为act_ru_task的外键; | | 执行ID | EXECUTION_ID_ | 与PROC_INST_ID_一致,为act_ru_execution的主键 | | 任务ID | TASK_ID_ | act_ru_task的主键,记录流程实例中,当前节点所处的任务;外键有PROC_INST_ID_ 和 EXECUTION_ID_ | #### 字段解释(二)act_ru_execution | 名称 | 字段 | 说明 | | -------- | ------------- | ------------------------------------------------------------ | | 业务主键 | BUSINESS_KEY_ | 关联外部业务主键(ApplicationId),需要在初始化流程时候传入; | | 节点ID | ACT_ID_ | 实例化的流程节点ID | | 节点名称 | ACT_NAME_ | 节点对应的中文名(自己画图时定义的) | | 候选人 | ASSIGNEE_ | 可以自由操作的一个字段 | #### 字段解释(三)act_ru_task | 名称 | 说明 | 说明 | | ---------- | ------------- | ------------------------------ | | 节点任务名 | NAME_ | 当前实例化的流程所处的节点名称 | | 描述信息 | DESCRIPTION_ | 可以自由操作的一个字段 | | 节点 | TASK_DEF_KEY_ | 当前实例化的流程所处的节点ID | | 候选人 | ASSIGNEE_ | 可以自由操作的一个字段 | ### Activiti实操 从创建模型到部署模型,再到实例化模型和运行模型。 [模型实操](study/workflow-st.md) #### 模型创建 | 接口路径 | 接口名称 | 备注 | 涉及表格 | | ----------------------- | -------------- | ------------------------------------------------- | ------------------------------------------------------------ | | /model/create | 创建一个空模型 | 用户创建一个初始化模型;必传字段是key和category; | act_re_model
act_ge_bytearray | | /model/{modelId}/save | 保存流程图 | 在流程设计的UI界面上点击保存按钮操作调用的接口 | act_re_model
act_ge_bytearray | | /model/{modelId}/deploy | 部署模型 | 传入模型ID部署模型 | act_re_model
act_ge_bytearray
act_re_deployment
act_re_procdef | #### 流程控制 | 接口路径 | 接口名称 | 备注 | 涉及表格 | | ------------------------- | ---------------- | ---------------------------------- | ---------------------------------------------- | | /flow/start | 开启流程 | 传入流程定义ID以及关联外部业务ID | act_ru_execution
act_ru_task
act_his_* | | /flow/complete | 完成任务 | 传入流程实例化ID,以及一些业务参数 | act_ru_execution
act_ru_task
act_his_* | | /flow/findRunTaskByInstId | 当前任务所在节点 | 传入当前流程实例化ID | act_ru_task | #### Activiti监听器了解 执行监听器( Execution listener) ![ExecuterListener](/study/work-flow-md/ExecuterListener.png) 任务监听器(Task listener) ![TaskListener](/study/work-flow-md/TaskListener.jpg) 画图配置 ![model-ui-02](study/work-flow-md/model-ui-02.png) ![model-ui-03](study/work-flow-md/model-ui-03.png) #### Activiti核心API了解 ProcessEngine ProcessInstance RuntimeService TaskService ### Activiti结合自身业务 往往,我们不会采用`Activiti`自带的用户角色表,如果要采用我们自己的角色用户系统,则需要添加一些额外的关联表。 ### Activiti系统任务和MQ 业务中有一些需要自动流过的节点,比如,“银行征信自动审批”,“推送开卡分期”。这类任务属于系统间交互的任务,人工无法介入。当系统满足一定条件就会触发流程推动。所以,采用了MQ消息机制。