Activiti7_流程实例

什么是流程部署?

参与者(可以是用户也可以是程序)按照流程定义内容发起一个流程,这就是一个流程实例。是动态的。

流程定义和流程实例的图解

流程部署

使用压缩包的方式部署流程

 1 /**
 2      * 压缩包的方式部署流程
 3      */
 4     @Test
 5     public void deploymentByZip(){
 6         //获取processEngine对象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //获取一个RepositoryService对象
 9         RepositoryService repositoryService = processEngine.getRepositoryService();
10         //定义一个输入流,加载Zip文件
11         InputStream inputStream=this.getClass().getClassLoader().getResourceAsStream("flowchart/process.zip");
12         //定义一个ZIPInputStream对象
13         ZipInputStream zipInputStream=new ZipInputStream(inputStream);
14         //流程部署
15         Deployment deploy = repositoryService.createDeployment()
16                 .addZipInputStream(zipInputStream)
17                 .name("请求审批流程")
18                 .key("processKey")
19                 .deploy();
20         System.out.println("流程名称:"+deploy.getName());
21 
22     }
压缩包的方式部署流程

结果

流程定义的查看

流程定义信息的查看

 1    /**
 2      * 流程定义信息的查看
 3      */
 4     @Test
 5     public void getProDef(){
 6         //获取processEngine对象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //获取一个RepositoryService对象
 9         RepositoryService repositoryService = processEngine.getRepositoryService();
10         //得到流程定义查看对象ProcessDefinitionQuery
11         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
12         //指定查看的流程   processDefinitionKey()指定流程定义的key值   orderByProcessDefinitionVersion根据流程定义版本号排序
13         List<ProcessDefinition> holiday = processDefinitionQuery.processDefinitionKey("myProcess").orderByProcessDefinitionVersion().desc().list();
14         for (ProcessDefinition proDef:holiday) {
15             System.out.println("流程定义ID:"+proDef.getId());
16             System.out.println("流程定义的名称:"+proDef.getName());
17             System.out.println("流程定义的Key:"+proDef.getKey());
18             System.out.println("流程定义的版本号:"+proDef.getVersion());
19         }
20     }
流程定义信息的查看

结果

流程删除

 1  /**
 2      * 删除流程:
 3      * 假设在删除时,当前正在有该流程实例执行,那么会导致删除失败
 4      * 如果强制要求,则可以使用repositoryService.deleteDeployment("1",true); true代表级联删除
 5      */
 6     @Test
 7     public void deleteDeployment(){
 8         //获取processEngine对象
 9         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
10         //获取一个RepositoryService对象
11         RepositoryService repositoryService = processEngine.getRepositoryService();
12         //删除流程
13         repositoryService.deleteDeployment("1",true);
14     }
删除流程

结果

 

获取数据库中流程资源信息

 1     /**
 2      * 从数据中读取资源文件到本地
 3      */
 4     @Test
 5     public void getResource() throws IOException {
 6         //获取processEngine对象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //获取一个RepositoryService对象
 9         RepositoryService repositoryService = processEngine.getRepositoryService();
10         //获取到流程查询对象
11         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
12         //获取到流程资源
13         processDefinitionQuery.processDefinitionKey("myProcess");
14         //获取单一结果
15         ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
16         //流程部署的ID
17         String deploymentId = processDefinition.getDeploymentId();
18         //获取到bpmnResource
19         InputStream bpmnStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
20         //获取到png
21         InputStream pngStream = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
22         //构建输出流
23         OutputStream bpmnOut = new FileOutputStream("D:\北大青鸟作业\2020年的练习\20200402\" + processDefinition.getResourceName());
24         OutputStream pngOut = new FileOutputStream("D:\北大青鸟作业\2020年的练习\20200402\" + processDefinition.getDiagramResourceName());
25         //将数据输出到磁盘当中
26         IOUtils.copy(bpmnStream,bpmnOut);
27         IOUtils.copy(pngStream,pngOut);
28         //关流
29         pngOut.close();
30         bpmnOut.close();
31         pngStream.close();
32         bpmnStream.close();
33     }
从数据中读取资源文件到本地

注意:IOUtils.copy()方法是import org.apache.commons.io.IOUtils;下的方法不是import sun.misc.IOUtils;

结果

业务系统和流程系统进行关联

通过buessinessKey字段标识业务系统的主键数据ID,进而表名当前业务执行到了哪一个流程

 1    /**
 2      * 启动流程实例和业务系统关联
 3      * 正常应该先添加数据到业务表当中,拿到当前添加数据的主键ID,通过启动流程实例,将主键ID交给BuessniessKkey
 4      * 代表和流程系统进行关联
 5      */
 6     @Test
 7     public void startInstance(){
 8         /**
 9          * 让张三在页面提交,然后拿到ID
10          */
11 
12         /**
13          * 创建张三请假的实例流程
14          */
15         //获取processEngine对象
16         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
17         RuntimeService runtimeService = processEngine.getRuntimeService();
18         //生成流程
19         ProcessInstance holiday = runtimeService.startProcessInstanceByKey("myProcess","2");
20 
21         /**
22          * 张三提交请假审批
23          */
24         //获取一个TaskService对象
25         TaskService taskService = processEngine.getTaskService();
26         //获取张三的任务
27         Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess").singleResult();
28         //任务审批
29         taskService.complete(task.getId());
30     }
启动流程实例和业务系统关联

结果:

流程激活和挂起

所有流程定义的挂起

 1 /**
 2      * 所有流程定义的挂起
 3      */
 4     @Test
 5     public void allSuspend(){
 6         //获取processEngine对象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //获取repositoryService对象
 9         RepositoryService repositoryService = processEngine.getRepositoryService();
10         //获取流程定义
11         ProcessDefinition holiday = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess").singleResult();
12         //获取到当前流程定义是否为暂停状态   suspended方法为true代表为暂停   false就是运行的
13         boolean suspended = holiday.isSuspended();
14         if(suspended){
15             repositoryService.activateProcessDefinitionById(holiday.getId(),true,null);
16             System.out.println("该流程定义激活");
17         }else{
18             repositoryService.suspendProcessDefinitionById(holiday.getId(),true,null);
19             System.out.println("该流程定义暂停");
20         }
21     }
所有流程定义的挂起

第一次运行结果

第二次运行结果

单个流程实例的挂起

 

 1 /**
 2      * 单个流程实例的挂起
 3      */
 4     @Test
 5     public void singleSuspend(){
 6         //获取processEngine对象
 7         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 8         //获取RuntimeService对象
 9         RuntimeService runtimeService = processEngine.getRuntimeService();
10         ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("5001").singleResult();
11 
12         //获取到当前流程定义是否为暂停状态   suspended方法为true代表为暂停   false就是运行的
13         boolean suspended = processInstance.isSuspended();
14         if(suspended){
15             runtimeService.activateProcessInstanceById("5001");
16             System.out.println("xx的请假流程激活");
17         }else{
18             runtimeService.suspendProcessInstanceById("5001");
19             System.out.println("xx的请假流程挂起");
20         }
21     }
单个流程实例的挂起

第一次运行结果

第二次运行结果

原文地址:https://www.cnblogs.com/wishsaber/p/12622983.html