1-流程部署
package com.activiti.process.Ⅱ;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.Test;
/**
* 流程定义CRUD
*/
public class ActivitiProcessCRUD {
/**
* 部署流程定义 通过classpath (一)
* */
@Test
public void deploymentProcessDefinition_Classpath(){
//获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取流程部署定义相关的Service
RepositoryService repositoryService = processEngine.getRepositoryService();
//创建一个部署对象
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
//创建部署名称
deploymentBuilder.name("请假流程入门");
//添加流程资源
deploymentBuilder.addClasspathResource("diagrams/helloworld.bpmn");
deploymentBuilder.addClasspathResource("diagrams/helloworld.png");
//完成部署
Deployment deployment = deploymentBuilder.deploy();
System.out.println("部署ID : "+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 部署流程定义 通过zip (二)
* */
@Test
public void deploymentProcessDefinition_zip(){
//创建一个zip输入流
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
//创建一个zip输入流
ZipInputStream zipInputStream = new ZipInputStream(in);
//与流程定义和部署对象相关的Service
Deployment deployment = ProcessEngines.getDefaultProcessEngine().getRepositoryService()
.createDeployment()//创建一个部署对象
.name("流程定义")//添加部署的名称
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID : "+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
/**
* 部署流程定义(从InputStream) (三)
* */
@Test
public void deploymentProcessDefinition_inputStream(){
InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
Deployment deployment = ProcessEngines.getDefaultProcessEngine().getRepositoryService()//与流程定义和部署对象相关的Service
.createDeployment()//创建一个部署对象
.name("流程定义")//添加部署的名称
.addInputStream("processVariables.bpmn", inputStreambpmn)//使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署
.addInputStream("processVariables.png", inputStreampng)//使用资源文件的名称(要求:与资源文件的名称要一致),和输入流完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//
System.out.println("部署名称:"+deployment.getName());//
}
/**
* 查询流程定义
* */
@Test
public void findProcessDefinition(){
//与流程定义和部署对象相关的Service
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
//创建流程查询
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//查询流程集合
List<ProcessDefinition> list = processDefinitionQuery.list();
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
System.out.println("资源名称bpmn文件:"+pd.getResourceName());
System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
System.out.println("部署对象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
/**指定查询条件,where条件*/
// processDefinitionQuery.deploymentId(deploymentId)//使用部署对象ID查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
// .processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询
/**排序*/
// .orderByProcessDefinitionVersion().asc()//按照版本的升序排列
// .orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列
/**返回的结果集*/
// .list();//返回一个集合列表,封装流程定义
// .singleResult();//返回惟一结果集
// .count();//返回结果集数量
// .listPage(firstResult, maxResults);//分页查询
}
/**
* 删除流程定义
* */
@Test
public void deleteProcessDefinition(){
//使用部署ID,完成删除
String deploymentId = "1";
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
/**
* 不带级联的删除
* 只能删除没有启动的流程,如果流程启动,就会抛出异常
*/
repositoryService.deleteDeployment(deploymentId);
/**
* 级联删除
* 不管流程是否启动,都能可以删除
*/
repositoryService.deleteDeployment(deploymentId, true);
System.out.println("删除成功!");
}
/***附加功能:查询最新版本的流程定义*/
@Test
public void findLastVersionProcessDefinition(){
//与流程定义和部署对象相关的Service
RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService();
//创建流程查询
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//使用流程定义的版本升序排列
List<ProcessDefinition> list = processDefinitionQuery.orderByProcessDefinitionVersion().asc().list();
/**
* Map<String,ProcessDefinition>
map集合的key:流程定义的key
map集合的value:流程定义的对象
map集合的特点:当map集合key值相同的情况下,后一次的值将替换前一次的值
*/
Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd);
}
}
List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values());
if(pdList!=null && pdList.size()>0){
for(ProcessDefinition pd:pdList){
System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
System.out.println("资源名称bpmn文件:"+pd.getResourceName());
System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
System.out.println("部署对象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**附加功能:删除流程定义(删除key相同的所有不同版本的流程定义)*/
@Test
public void deleteProcessDefinitionByKey(){
//流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//流程定义的key
String processDefinitionKey = "helloworld";
//先使用流程定义的key查询流程定义,查询出所有的版本
List<ProcessDefinition> list = processEngine.getRepositoryService()//
.createProcessDefinitionQuery()//
.processDefinitionKey(processDefinitionKey)//使用流程定义的key查询
.list();
//遍历,获取每个流程定义的部署ID
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
//获取部署ID
String deploymentId = pd.getDeploymentId();
processEngine.getRepositoryService()//
.deleteDeployment(deploymentId, true);
}
}
}
}