Activiti7工作流引擎入门
流程的定义
创建 src/main/resources/diagram/holiday.bpmn 文件
画流程图
将holiday.bpmn文件复制后重命名为holiday.xml
右键 使用Diagrams --> SHOW BPMN 2.0 Desinger 查看 holiday.xml 文件
将图片holiday.png保存到src/main/resources/diagram/目录中
流程的部署
package com.hellogitee.activiti;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
/**
* 流程定义的部署
* 表
* act_re_deployment
* act_re_procdef
* act_ge_bytearray
*/
public class ActivitiDeployment {
// 流程部署
public static void main(String[] args) {
// 1、创建ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、进行部署
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn") //添加bpmn资源
.addClasspathResource("diagram/holiday.png") //添加图片资源
.name("请假申请单流程")
.deploy();// 部署
// 4、输出部署的一些信息
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
}
压缩包部署方式
将 holiday .bpmn 和 holiday .png 压缩成 zip 包。
public void deployProcessByZip() {
// 定义zip输入流
InputStream inputStream = this.getClass()
.getClassLoader()
.getResourceAsStream("diagram/holiday.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
// 获取repositoryService
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine()
.getRepositoryService();
// 流程部署
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
}
启动流程实例
启动流程实例:前提是先已经完成流程定义的部署工作
**
* 启动流程实例:前提是先已经完成流程定义的部署工作
* 影响的表:
* act_hi_actinst 已完成的活动信息
* act_hi_identitylink 参与者信息
* act_hi_procinst 流程实例
* act_hi_taskinst 任务实例
* act_ru_execution 执行表
* act_ru_identitylink 参与者信息
* act_ru_task 任务
*/
public class ActivitiStartInstance {
public static void main(String[] args) {
// 1. 得到 ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 得到 RunServer对象
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.创建流程实例
ProcessInstance processInstance= runtimeService.startProcessInstanceByKey("holiday");
// 4. 输出实例相关信息
System.out.println("流程定义ID " + processInstance.getProcessDefinitionId());
System.out.println("流程实例ID " + processInstance.getId());
System.out.println("流程活动ID " + processInstance.getActivityId());
}
}
查询当前个人待执行的任务
/**
* 查询当前用户的列表
*/
public class ActivitiTaskQuery{
public static void main(String[] args) {
// 1. 得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 得到 TaskService 对象
TaskService taskService = processEngine.getTaskService();
// 3. 根据流程定义的key,负责人assignee来实现当前用户的任务列表查询
List list = taskService.createTaskQuery()
.processDefinitionKey("holiday")
.taskAssignee("zhangsan")
.list();
// 4. 任务列表的展示
for (Task task:list) {
System.out.println();
System.out.println("流程实例ID: " + task.getProcessInstanceId());
System.out.println("任务id: " + task.getId());
System.out.println("任务负责人: " + task.getAssignee());
System.out.println("任务名称: " + task.getName());
}
}
}
// 任务处理
public class ActivitiTaskCompletTask {
public static void main(String[] args) {
// 1. 得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 得到 TaskService 对象
TaskService taskService = processEngine.getTaskService();
// 3. 处理任务,结合当前用户任务列表的查询操作,找到任务ID
taskService.complete(taskService.createTaskQuery()
.processDefinitionKey("holiday")
.taskAssignee("zhangsan")
.singleResult()
.getId()
);
}
}
查询流程定义信息
/**
* 查询流程定义信息
*/
public class QueryProcessDefinition {
public static void main(String[] args) {
// 1.得到ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3. 得到ProcessDefinitioQuery对象,可以认为他就是一个查询器
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 4.设置条件,并查询出当前的所有流程定义,查询条件:流程定义的key = holiday
List list = processDefinitionQuery.processDefinitionKey("holiday")
.orderByProcessDefinitionVersion()
.desc().list();
// 5. 输出流程定义信息
for (ProcessDefinition processDefinition:list) {
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());
}
}
}
删除已经部署的流程定义
/**
* 删除已经部署的流程定义
*/
public class DeleteProcessDefinition {
public static void main(String[] args) {
// 1.得到ProcessEngine 对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.删除流程定义,参数代表流程部署的id
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment("1");
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除
// repositoryService.deleteDeployment("1",true);
}
}
/**
说明:
1) 使用 repositoryService 删除流程定义
2) 如果该流程定义下没有正在运行的流程,则可以用普通删除。
3) 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关
记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使
用。
*/
将两个资源文件保存到本地
/**
* 需求:
* 1.从Activiti的act_ge_bytearay表中读取两个资源文件
* 2. 将两个资源文件保存到本地
* 用户需要知道这个流程具体有哪些步骤要走
*/
public class QueryBpmnFile {
public static void main(String[] args) throws IOException {
// 1.得到ProcessEngine对象
ProcessEngine drocessEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到RepositoryService对象
RepositoryService repositoryService = drocessEngine.getRepositoryService();
// 3.得到查询器:ProcessDefinitionQuery对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
// 4.设置查询条件
processDefinitionQuery.processDefinitionKey("holiday");
// 5.执行查询操作,查询出想要的流程定义
ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
// 6.通过流程定义信息,得到部署ID
String deploymentId = processDefinition.getDeploymentId();
// 7.通过repositoryServicce方法,实现读取图片信息及bpmn文件信息(输入流)
// getResourceAsStream()方法参数说明: 第一个参数部署id,第二个参数代表资源名称
// processDefinition.getDiagramResourceName() 代表获取png图片资源的名称
InputStream pngIs = repositoryService
.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
// processDefinition.getResourceName() 代表获取bpm文件资源的名称
InputStream bpmnIs = repositoryService
.getResourceAsStream(deploymentId, processDefinition.getResourceName());
// 8.构造出OutputStream
FileUtils.forceMkdirParent(new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getDiagramResourceName()));
FileUtils.forceMkdirParent(new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getResourceName()));
OutputStream pngOs =
new FileOutputStream(
new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getDiagramResourceName()));
OutputStream bpmnOs =
new FileOutputStream(
new File("/home/aj/IdeaProjects/filedownload/" + processDefinition.getResourceName()));
// 9.输入流,输出流的转换 commons-io **.jar 中的方法
IOUtils.copy(pngIs,pngOs);
IOUtils.copy(bpmnIs,bpmnOs);
// 10.关闭流
pngOs.close();
bpmnOs.close();
pngIs.close();
bpmnIs.close();
}
}
流程历史信息的查看
即使流程定义已经删除了,流程执行的历史信息通过前面的分析,依然保存在 activiti 的 act_hi_*相
关的表中。所以我们还是可以查询流程执行的历史信息,可以通过 HistoryService 来查看相关的历史
记录。
/**
* 历史数据查看
*/
public class QueryHistory {
public static void main(String[] args) {
//1. 得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 得到HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 3. 得到HistoricActivityInstanceQuery对象
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
historicActivityInstanceQuery.processInstanceId("2501")
.orderByHistoricActivityInstanceStartTime()
.asc();
// 4. 执行查询
List list = historicActivityInstanceQuery.list();
// 5. 遍历查询结果
for(HistoricActivityInstance instance : list){
System.out.println(instance.getActivityId());
System.out.println(instance.getActivityName());
System.out.println(instance.getProcessDefinitionId());
System.out.println(instance.getProcessInstanceId());
System.out.println("==============================");
}
}
}