1. 什么是流程实例
参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例,是动态的。
2. 流程定义和流程实例的图解
3.使用 压缩包 部署流程
编写测试代码
//以压缩包方式进行部署流程
@Test
public void deploymentByZip(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//定义一个输入流,加载 Zip 文件
InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("bpmnfile/holiday.zip");
//定义一个ZIPInputStream对象
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
//流程部署
Deployment deploy = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请求审批流程")
.key("holidayKey")
.deploy();
System.out.println("流程名称:"+deploy.getName());
}
查看数据库
4. 查看流程定义
编写测试代码
//流程定义的查看
@Test
public void getProDef(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//得到流程定义查看对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//指定查看的流程 processDefinitionKey()指定流程定义的key值 orderByProcessDefinitionVersion根据流程定义版本号排序
List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("holiday").orderByProcessDefinitionVersion().desc().list();
for (ProcessDefinition proDef:holiday) {
System.out.println("流程定义ID:"+proDef.getId());
System.out.println("流程定义的名称:"+proDef.getName());
System.out.println("流程定义的Key:"+proDef.getKey());
System.out.println("流程定义的版本号:"+proDef.getVersion());
}
}
控制台结果
5. 删除流程
编写测试代码
//删除流程
@Test
public void deletDeployment(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//删除流程
repositoryService.deleteDeployment("5002",true);
}
6. 从数据中读取资源文件到本地
编写测试代码
//从数据中读取资源文件到本地
@Test
public void getResource() throws IO Exception {
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取一个RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取到流程查询对象
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//获取到流程资源
processDefinitionQuery.processDefinitionKey("holiday");
//获取单一结果
ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
//流程部署的ID
String deploymentId = processDefinition.getDeploymentId();
//获取到bpmnResource
InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//获取到png
InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//构建输出流
OutputStream bpmnOut = new FileOutputStream("F:\\" + processDefinition.getResourceName());
OutputStream pngOut = new FileOutputStream("F:\\" + processDefinition.getDiagramResourceName());
//将数据输出到磁盘当中
IOUtils. copy (bpmnStream,bpmnOut);
IOUtils.copy(pngStream,pngOut);
//关流
pngOut.close();
bpmnOut.close();
pngStream.close();
bpmnStream.close();
}
查看文件
7. 业务系统和流程系统进行关联
编写测试代码
//业务系统和流程系统进行关联
@Test
public void startInstance(){
/**
* 创建张三请假的实例流程
*/
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
runtime Service runtimeService = processEngine.getRuntimeService();
//生成流程
ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday","2");
/**
* 张三提交请假审批
*/
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//获取张三的任务
Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").singleResult();
//任务审批
taskService.complete(task.getId());
}
查看数据库
8. 流程激活和挂起
编写测试代码
/**
* 所有流程定义的挂起
*/
@Test
public void allSuspend(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//获取流程定义
ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("holiday").singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = holiday.isSuspended();
if(suspended){
repositoryService.activateProcessDefinitionById(holiday.getId(),true,null);
System.out.println("该流程定义激活");
}else{
repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null);
System.out.println("该流程定义暂停");
}
}
控制台效果
9. 单个流程实例的挂起
编写测试代码
/**
* 单个流程实例的挂起
*/
@Test
public void singleSuspend(){
//获取processEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取RuntimeService对象
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("2501").singleResult();
//获取到当前流程定义是否为暂停状态 suspended方法为true代表为暂停 false就是运行的
boolean suspended = processInstance.isSuspended();
if(suspended){
runtimeService.activateProcessInstanceById("2501");
System.out.println("xx的请假流程激活");
}else{
runtimeService.suspendProcessInstanceById("2501");
System.out.println("xx的请假流程挂起");
}
}
控制台效果
如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
咱们下期见!学习更多 JAVA 知识与技巧(获取原文),关注与私信博主(666)