一、概念:
Activiti是工作流框架,是解决企业流程管理的解决方案。
二、特点:
Activiti是一个强大的业务流程管理(BPM)框架,他本身需要数据库支持,它使用了Mybatis作为持久化框架,对于数据库管理系统(DBMS)支持多个。并且它的数据库表名有一定的特征。
三、数据库表结构:
1.资源库流程规则表
1)act_re_deployment 部署信息表
2)act_re_model 流程设计模型信息表
3)act_re_procdef 流程定义数据表
2.运行时数据库表
1)act_ru_execution 运行时流程执行实例表
2)act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息
3)act_ru_task 运行时任务节点表
4)act_ru_variable 运行时流程变量数据表
3.历史数据库表
1)act_hi_actinst 历史节点表
2)act_hi_attachment 历史附件表
3)act_hi_comment 历史意见表
4)act_hi_identitylink 历史流程人员表
5)act_hi_detail 历史详情表,提供历史变量的查询
6)act_hi_procinst 历史流程实例表
7)act_hi_taskinst 历史任务实例表
8)act_hi_varinst 历史变量表
4.组织机构表
1)act_id_group 用户组信息表 JBPM_ID_MEMBERSHIP
2)act_id_info 用户扩展信息表
3)act_id_membership 用户与用户组对应信息表
4)act_id_user 用户信息表
这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足
5.通用数据表
1)act_ge_bytearray 二进制数据表
2)act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。
四、示例数据库配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 创建ProcessEngineConfiguration对象的bean -->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 配置对象的配置信息 :连接数据库,使用MyBatis连接池 -->
<property name="jdbcUrl"
value="jdbc:mysql:///activiti?createDatabaseIfNotExist=true" />
<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
<property name="jdbcUsername" value="root" />
<property name="jdbcPassword" value="root" />
<!--
databaseSchemaUpdate: 设置流程引擎启动和关闭时如何处理数据库表。
false(默认):检查数据库表的版本和依赖库的版本, 如果版本不匹配就抛出异常。
true: 构建流程引擎时,执行检查,如果需要就执行更新。 如果表不存在,就创建。
create-drop: 构建流程引擎时创建数据库表,关闭流程引擎时删除这些表。
-->
<property name="databaseSchemaUpdate" value="true" />
</bean>
五、4个核心的api
ProcessEngine(核心--服务大管家),在Activiti中是最核心的类,其他的类都是由他而来。
最佳产生方式:
![ProcessEngine(流程引擎)最佳创建方式](https://img-blog.csdnimg.cn/2018112819265667.png)
1. // 查询部署信息列表和流程定义列表
RepositoryService repositoryService =processEngine.getRepositoryService();
2.// 查询运行的实例的表
RuntimeService runtimeService =processEngine.getRuntimeService();
3.// 查询任务表
TaskService taskService =processEngine.getTaskService();
4.// 查询历史的表
HistoryService historyService =processEngine.getHistoryService();
六、核心业务
1、绘制流程–定义(规则)流程 RepositoryService 接口 crud
1.部署发布流程(流程定义bpmn和流程图像)
2.查询流程定义和部署列表
3.删除(物理删除,流程的挂起和激活)
4.显示流程图像
import static org.junit.Assert.*;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.DeploymentQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;
import org.junit.Test;
/***
* 1.流程定义 2.流程发布
*
* @author Administrator
*
*/
public class ProcessDefintionTest {
// 添加发布部署
@Test
public void testDeloy() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
// 上传资源
createDeployment.addClasspathResource("MyProcess.bpmn");
createDeployment.addClasspathResource("MyProcess.png");
createDeployment.name("xxx");
// 部署发布
Deployment deploy = createDeployment.deploy();
System.out.println(deploy);
}
// 删除部署(物理删数-真删)
@Test
public void testdeleteDeloy() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
repositoryService.deleteDeployment("2501");
System.out.println();
}
// 假删除部署 (挂起和激活)
@Test
public void testUpdateDeleteDeloy() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 挂起
//repositoryService.suspendProcessDefinitionByKey("myProcess");
// 激活
repositoryService.activateProcessDefinitionByKey("myProcess");
}
// 显示流程图片
@Test
public void testShowPng() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// web项目输出到浏览器的输入流
// 模拟输出本地硬盘
// 获取png图片
String deploymentId="5001";
String resourceName="MyProcess.png";
// 获取输入的流对象 读的字节
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
//模拟输出本地硬盘
IOUtils.copy(resourceAsStream, new FileOutputStream("d:/a.png"));
}
// 查询部署列表
@Test
public void testQueryDeloy() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 查询对象
DeploymentQuery createDeploymentQuery = repositoryService.createDeploymentQuery();
// 设置查询条件
// createDeploymentQuery.deploymentName(name)
//createDeploymentQuery.deploymentId(deploymentId)
//createDeploymentQuery.deploymentNameLike(nameLike)
//createDeploymentQuery.listPage(firstResult, maxResults)
//createDeploymentQuery.singleResult();
List<Deployment> list = createDeploymentQuery.list();
for (Deployment deployment : list) {
System.out.println(deployment.getDeploymentTime());
}
}
// 查询流程定义信息列表
@Test
public void testQueryProcessDef() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取查询对象
ProcessDefinitionQuery createProcessDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 设置查询条件
//createProcessDefinitionQuery.listPage(firstResult, maxResults)
List<ProcessDefinition> list = createProcessDefinitionQuery.list();
for (ProcessDefinition pd : list) {
System.out.println(pd);
}
}
}
2、流程运行时管理–核心(ProcessInstance) RuntimeService
processInstance 的实例如果是单线的话processInstance对象就是excution对象
1、启动流程
2、查看任务
私有任务
公共任务
3、认领任务
4、办理任务
5、查看流程状态
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Test;
public class ProcessInstance_Test {
// 添加发布部署
@Test
public void testDeloy() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RepositoryService 仓库
RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
// 获取流程发布对象
DeploymentBuilder createDeployment = repositoryService.createDeployment();
// 上传资源
createDeployment.addClasspathResource("codeProcess.bpmn");
createDeployment.addClasspathResource("codeProcess.png");
createDeployment.name("开发任务");
// 部署发布
Deployment deploy = createDeployment.deploy();
System.out.println(deploy);
}
// 启动流程实例
@Test
public void testStartInstance() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// runtimeService 运行
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
// 根据流程的定义key启动
ProcessInstance startProcessInstanceByKey = runtimeService.startProcessInstanceByKey("myProcess");
System.out.println(startProcessInstanceByKey);
}
// 获取任务列表
@Test
public void testQueryTask() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
List<Task> list = createTaskQuery.list();
for (Task task : list) {
System.out.println(task);
}
}
// 获取某个人的任务列表
@Test
public void testQueryTaskByName() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 获取查询对象
TaskQuery createTaskQuery = taskService.createTaskQuery();
// 设置查询条件
createTaskQuery.taskAssignee("ls");
List<Task> list = createTaskQuery.list();
for (Task task : list) {
System.out.println(task);
}
}
// zs 办理完成任务 私有任务
@Test
public void testCompleTaskByName() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "10004";
taskService.complete(taskId);
}
// ww 办理完成任务 私有任务
@Test
public void testwwCompleTaskByName2() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "5002";
taskService.complete(taskId);
}
// zs 认领公有任务
@Test
public void testCaimTask() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "2504";
String userId="zs";
// 要
taskService.claim(taskId, userId);
}
// ls 办理完成任务 私有任务
@Test
public void testlsCompleTaskByName() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// TaskService 任务
TaskService taskService = defaultProcessEngine.getTaskService();
// 完成任务
String taskId = "12502";
taskService.complete(taskId);
}
// 查询流程是否结束
@Test
public void testIsEnd() throws Exception {
// 获取核心对象 服务大管家
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
// RuntimeService 运行
RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();
// 查询对象
ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery();
// 根据id
ProcessInstance singleResult = createProcessInstanceQuery.processInstanceId("2501").singleResult();
// 如果singleResult找到说明流程还没有结束
if (singleResult != null) {
System.out.println("流程未结束或不存在");
} else {
System.out.println("流程结束");
}
}
}