• 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     }
    单个流程实例的挂起

    第一次运行结果

    第二次运行结果

  • 相关阅读:
    springboot(10)logback日志配置
    springboot(9)springboot整合redis
    springboot(8)springboot整合mybatis
    springboot(7)springboot整合freemarker和thymeleaf
    springboot(6)过滤器 监听器 拦截器
    springboot(5)单元测试及MockMVC类的使用及自定义异常处理
    springboot(4)springboot热部署插件及idea热部署及配置文件注解注入
    springboot(3)使用MultipartFile上传数据文件及项目打成jar包
    springboot(2)内置序列化框架为Jackson及springboot文件目录结构
    git rebase
  • 原文地址:https://www.cnblogs.com/wishsaber/p/12622983.html
Copyright © 2020-2023  润新知