Activiti(十二)排他网关,并行网关

原文链接

一、排他网关


[java]  view plain  copy
  1. public class ExclusiveGateWayTest {  
  2.   
  3.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  4.       
  5.     /**部署流程定义(从inputStream)*/  
  6.     @Test  
  7.     public void deploymentProcessDefinition_inputStream(){  
  8.         InputStream inputStreamBpmn = this.getClass().getResourceAsStream("exclusiveGateWay.bpmn");  
  9.         InputStream inputStreamPng = this.getClass().getResourceAsStream("exclusiveGateWay.png");  
  10.         Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service  
  11.                         .createDeployment()//创建一个部署对象  
  12.                         .name("排他网关")//添加部署的名称  
  13.                         .addInputStream("exclusiveGateWay.bpmn", inputStreamBpmn)//  
  14.                         .addInputStream("exclusiveGateWay.png", inputStreamPng)//  
  15.                         .deploy();//完成部署  
  16.         System.out.println("部署ID:"+deployment.getId());//  
  17.         System.out.println("部署名称:"+deployment.getName());//  
  18.     }  
  19.       
  20.     /**启动流程实例*/  
  21.     @Test  
  22.     public void startProcessInstance(){  
  23.         //流程定义的key  
  24.         String processDefinitionKey = "exclusiveGateWay";  
  25.         ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service  
  26.                         .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
  27.         System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101  
  28.         System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4  
  29.     }  
  30.       
  31.     /**查询当前人的个人任务*/  
  32.     @Test  
  33.     public void findMyPersonalTask(){  
  34.         String assignee = "王小五";  
  35.         List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service  
  36.                         .createTaskQuery()//创建任务查询对象  
  37.                         /**查询条件(where部分)*/  
  38.                         .taskAssignee(assignee)//指定个人任务查询,指定办理人  
  39. //                      .taskCandidateUser(candidateUser)//组任务的办理人查询  
  40. //                      .processDefinitionId(processDefinitionId)//使用流程定义ID查询  
  41. //                      .processInstanceId(processInstanceId)//使用流程实例ID查询  
  42. //                      .executionId(executionId)//使用执行对象ID查询  
  43.                         /**排序*/  
  44.                         .orderByTaskCreateTime().asc()//使用创建时间的升序排列  
  45.                         /**返回结果集*/  
  46. //                      .singleResult()//返回惟一结果集  
  47. //                      .count()//返回结果集的数量  
  48. //                      .listPage(firstResult, maxResults);//分页查询  
  49.                         .list();//返回列表  
  50.         if(list!=null && list.size()>0){  
  51.             for(Task task:list){  
  52.                 System.out.println("任务ID:"+task.getId());  
  53.                 System.out.println("任务名称:"+task.getName());  
  54.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
  55.                 System.out.println("任务的办理人:"+task.getAssignee());  
  56.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  57.                 System.out.println("执行对象ID:"+task.getExecutionId());  
  58.                 System.out.println("流程定义ID:"+task.getProcessDefinitionId());  
  59.                 System.out.println("########################################################");  
  60.             }  
  61.         }  
  62.     }  
  63.       
  64.     /**完成我的任务*/  
  65.     @Test  
  66.     public void completeMyPersonalTask(){  
  67.         //任务ID  
  68.         String taskId = "3904";  
  69.         //完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应exclusiveGateWay.bpmn文件中${money>1000}  
  70.         Map<String, Object> variables = new HashMap<String, Object>();  
  71.         variables.put("money"200);  
  72.         processEngine.getTaskService()//与正在执行的任务管理相关的Service  
  73.                     .complete(taskId,variables);  
  74.         System.out.println("完成任务:任务ID:"+taskId);  
  75.     }  
  76. }  
说明:
  1).一个排他网关对应一个以上的顺序流
  2).由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。
  3).决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
  4).如果没有任何一个出口符合条件,则抛出异常
  5).使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。例如:

则执行连线:


如果使用流程变量设置


则执行连线:


扫描二维码关注公众号,回复: 1556268 查看本文章


二、并行网关


[java]  view plain  copy
  1. public class ParallelGateWayTest {  
  2.   
  3.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  4.       
  5.     /**部署流程定义(从inputStream)*/  
  6.     @Test  
  7.     public void deploymentProcessDefinition_inputStream(){  
  8.         InputStream inputStreamBpmn = this.getClass().getResourceAsStream("parallelGateWay.bpmn");  
  9.         InputStream inputStreamPng = this.getClass().getResourceAsStream("parallelGateWay.png");  
  10.         Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service  
  11.                         .createDeployment()//创建一个部署对象  
  12.                         .name("并行网关")//添加部署的名称  
  13.                         .addInputStream("parallelGateWay.bpmn", inputStreamBpmn)//  
  14.                         .addInputStream("parallelGateWay.png", inputStreamPng)//  
  15.                         .deploy();//完成部署  
  16.         System.out.println("部署ID:"+deployment.getId());//  
  17.         System.out.println("部署名称:"+deployment.getName());//  
  18.     }  
  19.       
  20.     /**启动流程实例*/  
  21.     @Test  
  22.     public void startProcessInstance(){  
  23.         //流程定义的key  
  24.         String processDefinitionKey = "parallelGateWay";  
  25.         ProcessInstance pi = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service  
  26.                         .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动  
  27.         System.out.println("流程实例ID:"+pi.getId());//流程实例ID    101  
  28.         System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID   helloworld:1:4  
  29.     }  
  30.       
  31.     /**查询当前人的个人任务*/  
  32.     @Test  
  33.     public void findMyPersonalTask(){  
  34.         String assignee = "商家";  
  35.         List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service  
  36.                         .createTaskQuery()//创建任务查询对象  
  37.                         /**查询条件(where部分)*/  
  38.                         .taskAssignee(assignee)//指定个人任务查询,指定办理人  
  39. //                      .taskCandidateUser(candidateUser)//组任务的办理人查询  
  40. //                      .processDefinitionId(processDefinitionId)//使用流程定义ID查询  
  41. //                      .processInstanceId(processInstanceId)//使用流程实例ID查询  
  42. //                      .executionId(executionId)//使用执行对象ID查询  
  43.                         /**排序*/  
  44.                         .orderByTaskCreateTime().asc()//使用创建时间的升序排列  
  45.                         /**返回结果集*/  
  46. //                      .singleResult()//返回惟一结果集  
  47. //                      .count()//返回结果集的数量  
  48. //                      .listPage(firstResult, maxResults);//分页查询  
  49.                         .list();//返回列表  
  50.         if(list!=null && list.size()>0){  
  51.             for(Task task:list){  
  52.                 System.out.println("任务ID:"+task.getId());  
  53.                 System.out.println("任务名称:"+task.getName());  
  54.                 System.out.println("任务的创建时间:"+task.getCreateTime());  
  55.                 System.out.println("任务的办理人:"+task.getAssignee());  
  56.                 System.out.println("流程实例ID:"+task.getProcessInstanceId());  
  57.                 System.out.println("执行对象ID:"+task.getExecutionId());  
  58.                 System.out.println("流程定义ID:"+task.getProcessDefinitionId());  
  59.                 System.out.println("########################################################");  
  60.             }  
  61.         }  
  62.     }  
  63.       
  64.     /**完成我的任务*/  
  65.     @Test  
  66.     public void completeMyPersonalTask(){  
  67.         //任务ID  
  68.         String taskId = "4302";  
  69.         processEngine.getTaskService()//与正在执行的任务管理相关的Service  
  70.                     .complete(taskId);  
  71.         System.out.println("完成任务:任务ID:"+taskId);  
  72.     }  
  73. }  


说明:

  1).一个流程中流程实例只有1个,执行对象有多个
  2).并行网关的功能是基于进入和外出的顺序流的:
      分支(fork) : 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
      汇聚(join) : 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
  3).并行网关的进入和外出都是使用相同节点标识
  4).如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
   5).并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
  6).并行网关不需要是“平衡的”(比如, 对应并行网关的进入和外出节点数目不一定相等)。如图中标示是合法的:

猜你喜欢

转载自blog.csdn.net/newhanzhe/article/details/80644503