目录
引入依赖
创建activiti.cfg.xml配置文件(名字固定)
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 这个bean的id是不可改的-->
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://101.35.118.177:3306/study-activiti"/>
<property name="jdbcUsername" value="root"/>
<property name="jdbcPassword" value="Citi@2014"/>
<!-- activiti 数据库在生成的时候 ture 如果数据库中存在响应的表,则直接使用,不重新生成 -->
<property name="databaseSchemaUpdate" value="true"/>
</bean>
</beans>
构建activit相关的数据表
方式一:
package com.any.utils;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
public class CreateActivitiSchema {
/**
* 使用activiti 提供的默认方式来创建mysql的表
* @throws
* @update 2021-11-15 15:59 by 15821
*/
public static void main(String[] args) {
// 需要使用processEngine 提供的工具类processEngine,使用方法getDefaultProcessEngine()\
// 使用方法getDefaultProcessEngine 方法就从Activiti.cfg.xml中获取所定义得信息
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
}
}
方式二:
package com.any.utils;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
public class CreateActivitiSchema {
/**
* 根据自定义的xml和bean名称进行创建数据表
* @throws
* @update 2021-11-15 15:59 by 15821
*/
public static void main(String[] args) {
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml","processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
}
表结构
通用的数据表(ACT_GE_)2张
表名 | 描述 | |
ACT_GE_BYTEARRAY | 通用的流程定义和流程资源 | |
ACT_GE_PROPERTY | 系统相关属性 |
流程历史记录(ACT_HI_) 8张
表名 | 描述 |
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_)3张
表名 | 描述 | |
ACT_RE_DEPLOYMENT | 部署单元信息 | |
ACT_RE_MODEL | 模型信息 | |
ACT_RE_PROCDEF | 已部署的流程定义 |
运行实例表 (ACT_RU_)6张
表名 | 描述 | |
ACT_RU_DEADLETTER_JOB | ||
ACT_RU_EVENT_SUBSCR | 运行时事件 | |
ACT_RU_EXECUTION | 运行时流程执行实例 | |
ACT_RU_IDENTITYLINK | 运行时用户关系信息,存储任务节点与参与者的相关信息 | |
ACT_RU_INTEGRATION | ||
ACT_RU_JOB | 运行时作业 | |
ACT_RU_SUSPENDED_JOB | ||
ACT_RU_TASK | 运行时任务 | |
ACT_RU_TIMER_JOB | ||
ACT_RU_VARIABLE | 运行时变量表 |
其它2张
表名 | 描述 | |
ACT_EVT_LOG | 事件日志 | |
ACT_PROCDEF_INFO | 流程定义的动态变更信息 |
流程符号简介
BPMN2.0 是业务流程建模符号2.0 的缩写
事件Event
活动activity
活动是工作和任务的一个通用术语。一个活动可以是一个任务,也可以是一个子任务的处理流程
网关AateWay
网管用于处理决策,常用的网关
排他网关(X)
- 只有一条路径会被选择,流程执行到该网关时,按照输出流的顺序逐个计算,当条件计算结果为true时,继续执行当前网
- 如果多条线路同时执行的结果都是true,则会执行第一个值为true的路线,如果所有路线都不是true时,则引擎会抛出异常
- 排他网关需要和条件顺序结合使用,default属性指定默认顺序流,当所有的条件不满足时会执行默认顺序流
并行网关(+)
所有路线都会被同时选择
- 拆分——并行执行所有输出顺序流,为每一条顺序流创建一个并行执行线路。
- 合并——所有从并行网关拆分并执行完成的路线均在此等候,知道所有的线路都执行完成才继续向下执行
包容网关
可以同时执行多条线路,也可以在网关上设置条件
- 拆分——计算每条路线上的表达式,当表达式计算为true时,创建一个并行线路并继续执行
- 合并—— 所有从并行网关拆分并执行完成的路线均在此等候,知道所有的线路都执行完成才继续向下执行
事件网关
专门为中间捕获事件设置的,允许设置多个输出流指向多个不同的中间捕获事件。
流向 Flow
流向是连接两个流程节点的连线,常见的流向包括一下几种:
后面补充
工作流引擎
ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。
Service总览
可以通过工作引擎(ProcessEngine)获取所有的service
Service名称 | 描述 | |
RepositoryService | Activiti的资源管理类 | |
RuntimeService | Activiti的流程运行管理类 | |
TaskService | Activiti的任务管理类 | |
HistoryService | activiti的历史管理类 | |
ManagerService | activiti的引擎管理类 |
入门实验
部署
通过ProcessEngin获取RepositoryService,部署牵扯到的表操作(ACT_GE_BYTEARRAY 资源表、ACT_RE_DEPLOYMENT 部署表、ACT_RE_PROCDEF 流程定义表)
/**
* 部署流程
* @update 2021-11-16 17:22 by 15821
*/
public void testDeployment() {
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml","processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
//2. 获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3. 使用service进行流程部署
Deployment deployment = repositoryService.createDeployment()
.name("创建出差流程")
.addClasspathResource("bpmn/evection.bpmn20.xml")
.deploy();
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
流程定义查询
/**
* 流程定义查询
* @update 2021-11-17 08:48 by 15821
*/
public void testQueryProcessDefinition() {
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.orderByProcessDefinitionVersion()
.desc()
.list();
for (ProcessDefinition processDefinition : processDefinitions) {
System.out.println("流程定义ID:" + processDefinition.getId());
System.out.println("流程定义名称:" + processDefinition.getName());
System.out.println("流程定义KEY:" + processDefinition.getKey());
System.out.println("流程定义版本:" + processDefinition.getVersion());
System.out.println("流程部署id:" + processDefinition.getDeploymentId());
}
}
删除部署
/**
* 删除部署
* @update 2021-11-17 09:08 by 15821
*/
public void testDeleteDeployment() {
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
String deploymentId = "1";
repositoryService.deleteDeployment(deploymentId);
}
启动
通过ProcessEngin获取RuntimeService根据流程定义的key进行启动
操作表
- ACT_HI_ACTINST 流程实例执行历史
- ACT_HI_IDENTITYLINK 流程参与用户的历史信息
- ACT_HI_PROCINST 流程实例的历史信息
- ACT_HI_TASKINST 流程任务的历史信息
- ACT_RU_EXECUTION 流程执行信息
- ACT_RU_IDENTITYLINK 流程的正在参与用户信息
- ACT_RU_TASK 流程当前任务xi
/**
* 启动流程
* @update 2021-11-16 17:22 by 15821
*/
public void testStartProcess(){
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml","processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance myEvection = runtimeService.startProcessInstanceByKey("myEvection");
System.out.println("流程定义ID:"+myEvection.getProcessDefinitionId());
System.out.println("流程实例ID:"+myEvection.getId());
System.out.println("当前活动ID:"+myEvection.getActivityId());
}
任务查询
通过ProcessEngin获取TaskService根据流程定义的key和负责人名称进行查询
/**
* 查询个人任务
* @update 2021-11-16 17:56 by 15821
*/
public void testFindPersonalTaskList(){
//1. 创建 processsEngine
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml","processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("myEvection")
.taskAssignee("rose")
.list();
}
任务完成
通过ProcessEngin获取TaskService根据任务id进行完成
/**
* 完成当前的个人任务
* @update 2021-11-16 18:19 by 15821
*/
public void testFinshPersonalTask(){
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml","processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
taskService.complete("10002");
}
下载资源
/**
* 下载资源文件
* @update 2021-11-17 09:22 by 15821
*/
public void downloadDeployment() throws IOException {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.获取ProcessDefinition,查询流程定义信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.singleResult();
// 4.获取流程定义信息获取部署id
String deploymentId = processDefinition.getDeploymentId();
String resourceName = processDefinition.getResourceName();
// 5.通过RepositoryService,传递部署id参数,读取资源信息
InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
// 6.构造outputStream流
File XmlFile = new File("D:/coding-project/test-download/evection.bpmn20.xml");
FileOutputStream outputStream = new FileOutputStream(XmlFile);
// 7.输入流输出流的转换
IOUtils.copy(resourceAsStream, outputStream);
// 8.关闭流
outputStream.close();
resourceAsStream.close();
}
查询历史信息
/**
* 查询历史信息
* @update 2021-11-18 16:46 by 15821
*/
public void testFindHistoryInfo() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 3. 获取actinst表的数据
HistoricActivityInstanceQuery activityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
// 4.添加查询条件
activityInstanceQuery.taskAssignee("zhangsan");
// 5.排序
activityInstanceQuery.orderByHistoricActivityInstanceStartTime().asc();
// 6.获取结果
List<HistoricActivityInstance> activityInstances = activityInstanceQuery.list();
// 7.测试输出
for (HistoricActivityInstance activityInstance : activityInstances) {
System.out.println(activityInstance.getActivityId());
System.out.println(activityInstance.getActivityName());
System.out.println(activityInstance.getProcessInstanceId());
System.out.println(activityInstance.getProcessDefinitionId());
System.out.println(
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.format(activityInstance.getStartTime()));
System.out.println("----------------------------------------------------");
}
}
绑定业务key
/**
* 添加业务的key 到activiti 表中 (ACT_RU_EXECUTION)
*
* @update 2021-11-18 18:35 by 15821
*/
@Test
public void addBusinessKey() {
// 1.获取引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService
.startProcessInstanceByKey("myEvection", "1001");
System.out.println(instance.getBusinessKey());
}
挂起与激活
根据流程定义来挂起(激活)
/**
* 全部流程实例的挂起和激活
*
* @update 2021-11-18 18:57 by 15821
*/
@Test
public void suspendAllProcessInstance() {
// 1、获取流程引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.查询流程定义
ProcessDefinition definition = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey("myEvection")
.singleResult();
// 4.判断当前的流程定义的实例是否都是挂起状态
boolean suspended = definition.isSuspended();
// 5.如果是挂起则激活
if (suspended) { // true 挂起
// 如果是挂起,则激活,
// activateProcessDefinitionById(流程定义Id,是否激活,激活时间)
repositoryService.activateProcessDefinitionById(
definition.getId(),
true,
null);
System.out.println("流程定义ID:" + definition.getId() + "已激活");
}else{
// 6.如果是激活则挂起
// suspendProcessDefinitionById(流程定义Id,是否挂起,激活时间)
repositoryService.suspendProcessDefinitionById(definition.getId(),
true,
null);
System.out.println("流程定义ID:" + definition.getId() + "已挂起");
}
}
挂起或激活单个流程实例
/**
* 挂起或激活单个流程实例
* @update 2021-11-18 20:05 by 15821
*/
@Test
public void suspendSingleProcessInstance(){
// 1、获取流程引擎
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
"activiti.cfg.xml", "processEngineConfiguration");
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
.processInstanceId("17501")
.singleResult();
boolean suspended = instance.isSuspended();
if(suspended){
// 如果是挂起,则激活,
// activateProcessDefinitionById(流程定义Id,是否挂起,激活时间)
runtimeService.activateProcessInstanceById(instance.getId());
System.out.println("流程实例ID:"+instance.getId()+"已经激活");
}else{
// 如果是激活则挂起
// suspendProcessDefinitionById(流程定义Id,是否挂起,激活时间)
runtimeService.suspendProcessInstanceById(instance.getId());
System.out.println("流程实例ID:"+instance.getId()+"已经挂起");
}
}