# 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数据库表格

说明:`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)

任务监听器(Task listener)

画图配置


#### Activiti核心API了解
ProcessEngine
ProcessInstance
RuntimeService
TaskService
### Activiti结合自身业务
往往,我们不会采用`Activiti`自带的用户角色表,如果要采用我们自己的角色用户系统,则需要添加一些额外的关联表。
### Activiti系统任务和MQ
业务中有一些需要自动流过的节点,比如,“银行征信自动审批”,“推送开卡分期”。这类任务属于系统间交互的任务,人工无法介入。当系统满足一定条件就会触发流程推动。所以,采用了MQ消息机制。