原Activiti的Tijs Rademakers团队去开发Flowable框架。
现Activiti7是 Salaboy团队开发的,内核使用的还是Activiti6,扩展了云化。Activiti5、Activiti6代码目前由 Salaboy团队代为维护,目前官宣已经暂停维护。
对比项\引擎 | Activiti-7.x | Flowable-6.x | Camunda- |
---|---|---|---|
商业化 | √ | √ | √ |
路线(Roadmap) | 云 | 工具型 | 轻量&工具型 |
PVM引擎 | × | × | √ |
BPMN2引擎 | √ | √ | √ |
CMMN引擎 | × | √ | × |
DMN引擎 | × | √(开源版支持不太好) | √ |
建模工具选型 | √(AngularJS) | √(AngularJS) | √(Bpmn.js&Camunda Provider) |
建模工具内容 | BPMN2 | BPMN2/CMMN/DMN | BPMN2/CMMN/DMN |
扩展节点(Mule/Http等) | × | √ | √ |
Spring Boot | √ | √ | √ |
Spring Cloud | √ | × | × |
Web控制台 | √ | √ | √ |
Rest接口 | √ | √ | √ |
历史异步归档 | × | √ | × |
异步任务全局锁 | × | √ | × |
官网:activiti.org
状态驱动开发(worker->manager)
通过、驳回、转办、加签、传阅、会签
statsu(尽量避免待审核/待处理这样的状态)
0.已创建
1.已提交
2.已部门经理审核
3.已总经理审核
4.审核通过
5.审核拒绝
需求总变 - 痛点产生
Engine工作流引擎
Drools规则引擎
Aviator表达式引擎
解决方案 - 修改配置
通过BPMN建模进行描述流程的变更
业务流程模型和符号(Bsiness Process Model And Notation)
通过符号描述一个完整的业务流程
这个图是Activiti里面所支持的,BPMN其实是没有那么详细的
事件驱动:Event
任务:Task
流程:ProcessInstance
构建复杂流程(网关):Gateway
子流程:SubProcess
注解:Annotation
1.部署activiti:可以理解为一堆Jar包,
2.定义流程:用BPMN定义业务流程
3.部署流程:定义流程是无效的,需要部署之后才能使用
4.启动流程:相当于用户提交业务单据
5.用户代办
6.用户已办
7.流程结束
Idea插件actiBPM
idea高于2019需要手动安装
plugins.jetbrains.com/plugin/7429-actibpm/versions
JDK8或以上,
MySQL5.7或以上(支持h2、MySQL、Oracle、Postgres、DB2、Mssql)
<properties>
<slf4j.version>1.6.6slf4j.version>
<log4j.version>1.2.12log4j.version>
<activiti.version>7.1.0.M6activiti.version>
<activiti.cloud.version>7.0.0.Beta1activiti.cloud.version>
<mysql.version>8.0.20mysql.version>
properties>
<dependencies>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-engineartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-springartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-bpmn-modelartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-bpmn-converterartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-json-converterartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-bpmn-layoutartifactId>
<version>${activiti.version}version>
dependency>
<dependency>
<groupId>org.activiti.cloudgroupId>
<artifactId>activiti-cloud-services-apiartifactId>
<version>${activiti.cloud.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
<version>3.4.5version>
dependency>
<dependency>
<groupId>commons-dbcpgroupId>
<artifactId>commons-dbcpartifactId>
<version>1.4version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>${log4j.version}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>${slf4j.version}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>${slf4j.version}version>
dependency>
dependencies>
activiti默认就会使用mysql来创建表。创建时需要先创建一个配置文件
activiti.cfg.xml,来对数据源信息进行定义。
在resources目录下创建activiti.cfg.xml文件。
Ps:
这个目录其实就是classpath下的默认位置。这是activiti默认读取
的目录和文件。
创建在其他目录下也是可以的,但是就需要在生成时指定文件的目录和
名字。
配置文件的基础内容如下: -这里主要是定义几个namespace。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/springbeans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"
/>
<property name="url" value="jdbc:mysql://localhost:3306/activiti?
serverTimezone=GMT%2B8" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxActive" value="3" />
<property name="maxIdle" value="1" />
bean>
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="dataSource" ref="dataSource" />
<property name="databaseSchemaUpdate" value="true"/>
bean>
beans>
PS:
1、processEngineConfiguration这个名字最好不要修改。这是
activiti读取的默认Bean名字。
2、在processEngineConfiguration中也可以直接配置jdbcDriver、
jdbcUrl、jdbcUsername、jdbcPassword几个属性。
3、关于databaseSchemaUpdate这个属性,稍微跟踪一下源码就能看
到他的配置方式:
默认是false;表示不创建数据库,只是检查数据库中的表结构,不满足
就会抛出异常
create-drop:表示在引擎启动时创建表结构,引擎处理结束时删除表结
构。
true:表示创建完整表机构,并在必要时更新表结构。
package com.roy;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.junit.Test;
/**
* @author :楼兰
* @date :Created in 2021/4/7
* @description:
**/
public class TestCreateTable {
/**
* 生成 activiti的数据库表
*/
@Test
public void testCreateDbTable() {
//默认创建方式
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//通用的创建方式,指定配置文件名和Bean名称
// ProcessEngineConfiguration processEngineConfiguration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource
("activiti.cfg.xml", "processEngineConfiguration");
// ProcessEngine processEngine1 = processEngineConfiguration.buildProcessEngine();
System.out.println(processEngine);
}
}
Ps:
注意:从这个代码就能看出我们之前那些默认配置的作用。
ProcessEngines.getDefaultProcessEngine()这行代码默认就会去读取
classpath:下的activiti.cfg.xml和activiti-context.xml两个配置文件。并
且从spring容器中加载名为processEngineConfiguration的Bean。
执行这个脚本就会完成mysql的表结构创建。如果执行正常,可以看到执行了一大
堆的sql语句,最终打印出一行日志
org.activiti.engine.impl.ProcessEngineImpl@77307458
这就表示引擎创建成功了。同时在mysql中可以看到activiti用到的25张表。
这些表机构通常也可以导出成sql文件,然后直接进行移植。但是考虑到
不同版本可能会有微调,所以通常不建议以sql文件的方式移植。
从这些刚才创建的表中可以看到,activiti的表都以act_开头。第二个部分表示表
的用途。用途也和服务的API对应。
ACT_RE:'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源
(图片,规则,等等)。
ACT_RU:'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异
步任务,等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录
。 这样运行时表可以一直很小速度很快。
ACT_HI:'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任
务等等。
ACT_GE: GE 表示 general。 通用数据, 用于不同场景下
完整的数据库表作用如下:
表分类 | 表名 | 解释 |
---|---|---|
一般数据 | [ACT_GE_BYTEARRAY] [ACT_GE_BYTEARRAY] |
通用的流程定义和流程资源 系统相关属性 |
流程历史记录 | [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_RE_DEPLOYMENT] [ACT_RE_MODEL] [ACT_RE_PROCDEF] |
部署单元信息 模型信息 已部署的流程定义 |
运行实例表 | [ACT_RU_EVENT_SUBSCR] [ACT_RU_EXECUTION] ACT_RU_IDENTITYLINK] [ACT_RU_JOB] [ACT_RU_TASK] [ACT_RU_VARIABLE] |
运行时事件 运行时流程执行实例 运行时用户关系信息,存储任务节点与参与者的相关信息 运行时作业 运行时任务 运行时变量表 |
部署成功则生成一条记录
流程id=myLeave:1:4
流程name=员工请假审批流程
流程key=myLeave
流程Version=1
部署ID=1
定义成功则生成一条记录
DEPLOYMENT_ID(流程部署外键)
RESOURCE-NAME(BPMN.xml文件)
DGRM_RESOURCE-NAME(BPMN.png文件)
二进制文件
act_ge_bytearray表
部署的时候存(xml、png)完整BLOB二进制文件直接入库
DEPLOYMENT_ID_(流程部署外键)
Zip上传部署
上传的时候命名要规范图片仅支持png、jpg、gif、svg格式
流程定义ID:myLeave:1:4
流程实例ID:2501
当前活动ID:null
流程实例ID:2501
任务id:2505
任务负责人:worker
任务名称:提交请假申请
任务处理
代办任务表
act_ru_task表
将任务从worker提交到manager审核节点
流程实例ID:2501
任务id:5002
任务负责人:manager
任务名称:部门经理审批
_2
StartEvent
myLeave:1:4
2501
<==========>
_3
提交请假申请
myLeave:1:4
2501
<==========>
_4
部门经理审批
myLeave:1:4
2501
<==========>
删除该流程当有审批中的业务默认删除会失败
需要使用级联删除可以完成强制删除
流程变量
act_ru_variable表
Event事件记录
act_evt_log表
Activiti只提供后台,所以只能叫他工作流引擎。
Activiti7操作25张表
流程定义:ProcessDefinition
流程实例:ProcessInstance
流程定义ProcessDefinition是以BPMN文件定义的一个工作流程
每个流程实例之间互补影响
预留扩展业务代码
流程变量:variables(Map
租户:tenantId(我们暂时用不到)
Businesskey默认长度255,不要超过255
我们启动一个流程实例的关键代码其实就是这一行
ProcessInstance processInstance = runtimeSewrvice。startProcessInstanceByKey("myLeave");
只走其中一条线路
每一条线路都要走
需要候选人在自己的代办列表进行认领,认领后候选人升级为责任人,其他候选人无此任务代办,责任人可退还任务或者转办任务,该任务节点所有候选人可以在代办进行认领,管理员可在本任务节点任何状态下指派任务
分配多个候选人,本节点任何一个候选人完成,任务往下一个任务节点走