Spring Boot集成Activiti
一、何为activiti?
activiti介绍 Activiti是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理,工作流,服务协作等领域的一个开源,灵活的,
易扩展的可执行流程语言框架。
二、核心7大接口、28张表
1、七大接口
RepositoryService:提供一系列管理流程部署和流程定义的API。
RuntimeService:在流程运行时对流程实例进行管理与控制。
TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
ManagementService:提供对流程引擎进行管理和维护的服务。
HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
FormService:表单服务。
2、二十八张表
act_ge_* 通用数据表,ge是general的缩写
act_hi_* 历史数据表,hi是history的缩写,对应HistoryService接口
act_id_* 身份数据表,id是identity的缩写,对应IdentityService接口
act_re_* 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
act_ru_* 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据
3、表结构详解
3.1:资源库流程规则表
1) act_re_deployment 部署信息表
2) act_re_model 流程设计模型部署表
3) act_re_procdef 流程定义数据表
3.2:运行时数据库表
1) act_ru_execution 运行时流程执行实例表
注:1、如果是单例流程(没有分支和聚合),则流程实例id(PROC_INST_ID)就是(等于)执行对象id(ID_)
2、一个流程只有一个流程实例,但执行对象可以有多个
2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
3) act_ru_task 运行时任务节点表
4) act_ru_variable 运行时流程变量数据表
3.3:历史数据库表
1) act_hi_actinst 历史节点表
2) act_hi_attachment 历史附件表
3) act_ih_comment 历史意见表
4) act_hi_identitylink 历史流程人员表
5) act_hi_detail 历史详情表,提供历史变量的查询
6) act_hi_procinst 历史流程实例表
7) act_hi_taskinst 历史任务实例表
8) act_hi_varinst 历史变量表
3.4:组织机构表
1) act_id_group 用户组信息表
2) act_id_info 用户扩展信息表
3) act_id_membership 用户与用户组对应信息表
4) act_id_user 用户信息表
这四张表使用很少,相当于一套简单的rbac框架,但很难满足我们的需求所以很少使用
3.5:通用数据表
1) act_ge_bytearray 二进制数据表
2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
4、表分类
4.1:流程部署相关表
act_re_deployement 部署对象表
act_rep_procdef 流程定义表
act_ge_bytearray 资源文件表
act_ge_prperty 主键生成策略表(对于部署对象表的主键ID)
4.2:流程实例相关表
act_ru_execution 正在执行的执行对象表(包含执行对象ID和流程实例ID,如果有多个线程可能流程实例ID不一样)
act_hi_procinst 流程实例历史表
act_hi_actinst 存放历史所有完成的任务
4.3:Task 任务相关表
act_ru_task 代办任务表 (只对应节点是UserTask的)
act_hi_taskinst 代办任务历史表 (只对应节点是UserTask的)
act_hi_actinst 所有节点活动历史表 (对应流程的所有节点的活动历史,从开始节点一直到结束节点中间的所有节点的活动都会被记录)
4.4:流程变量表
act_ru_variable 正在执行的流程变量表
act_hi_variable 流程变量历史表
5、activiti配置文件简述
5.1:命名
activiti.cfg.xml
5.2:定义数据库配置参数:
jdbcUrl: 数据库的JDBC URL。
jdbcDriver: 对应不同数据库类型的驱动。
jdbcUsername: 连接数据库的用户名。
jdbcPassword: 连接数据库的密码。
5.3:基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池
jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。
jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。
jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。
jdbcMaxWaitTime: 这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。 默认为20000(20秒)。
三、activiti必备插件(集成idea)
方法一、在idea插件市场搜索:actibpm,安装重启即可。
方法二、在浏览器搜索idea插件官网,下载actibpm插件,再导入到idea即可。
方法三、链接: https://pan.baidu.com/s/1UWvxxsdT_A8DSxWC_akSpA 提取码: 5ax5,下载后导入idea即可。
四、集成SpringBoot
1、导入依赖
2、配置 application.yml
spring:
activiti:
# 自动检查、部署流程定义文件
check-process-definitions: false
# 自动更新数据库结构,第一次生成表后改为false
database-schema-update: false
# 保存历史数据级别设置为full最高级别,便于历史数据的追溯
history-level: full
# 流程定义文件存放目录
process-definition-location-prefix: classpath:/processes/
#async-executor-activate: false
#job-executor-activate: false
注:databaseSchemaUpdate配置项可以设置流程引擎启动和关闭时数据库执行的策略,有如下四个值:
false:默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
true:Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
结论:database-schema-update开始设置为true,表创建好之后停止应用。再设为false,不再改变表的结构。
将check-process-definitions的值设为false,来阻止应用启动检查Activiti数据表是否存在及版本号是否匹配,从而提升应用启动速度
3、解決工作流生成图片乱码问题
1、新建一个类(可省略)
package com.kang.activiti.process;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
@Configuration
public class processEngineConfiguration implements ProcessEngineConfigurationConfigurer{
/**
* 解決工作流生成图片乱码问题
*
* @param processEngineConfiguration processEngineConfiguration
*/
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
}
}
2、修改/idea/bin目录下的idea.exe.vmoptions和idea64.exe.vmoptions文件,在文件最后添加 -Dfile.encoding=UTF-8
五、设计流程定义图
1、由于idea对于bpmn的设计并不是很友好,所以使用扩展工具来设计流程图
2、下载链接:https://camunda.com/download/modeler/
3、
4、当然也可以直接打开下载解压后的可执行文件进行流程图的设计。
5、camunda-modeler具体使用请看:
六、HelloWorld入门
package com.kang.activiti.process;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
public class Demo1 {
/**
* 获取七大接口
*/
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private IdentityService identityService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private ProcessEngine processEngine;
@Autowired
private HistoryService historyService;
//ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 1.通过定义好的流程图文件部署,一次只能部署一个流程
* act_ge_bytearray act_re_deployment act_re_procdef
*/
@Test
public void deploy(){
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("process/hello.bpmn")
.addClasspathResource("process/hello.png")
.deploy();
System.out.println("流程部署id" + deployment.getId());
System.out.println("流程部署Name" + deployment.getName());
}
/**
* 2.启动流程实例
* act_hi_actinst act_hi_identitylink act_hi_taskinst act_ru_execution act_ru_identitylink act_ru_task
*/
@Test
public void start(){
ProcessInstance pi = runtimeService
.startProcessInstanceByKey("myProcess_1");
System.out.println("流程实例id" + pi.getId());
System.out.println("流程部署Name" + pi.getName());
}
/**
* 3.查看个人任务
*/
@Test
public void findTask(){
List<Task> list = taskService
.createTaskQuery()
.taskAssignee("王五")//指定某人
.list();
for (Task task : list){
System.out.println("任务id" + task.getId());
System.out.println("任务name" + task.getName());
System.out.println("任务创建时间" + task.getCreateTime());
System.out.println("委派人name" + task.getAssignee());
System.out.println("流程实例name" + task.getProcessInstanceId());
}
}
/**
* 4.完成任务
*/
@Test
public void compeleTask(){
taskService.complete("27502");
System.out.println("完成任务");
}
}