Activity并行网关和排他网关

摘要:
说一说activiti中的排他网关和并行网关activiti工作流中我们经常用到的网关有两种:1.ExclusiveGateway排他网关排他网关.png排他网关,用来在流程中实现决策。通常情况下,所有条件结果˃为true的顺序流都会被选中,以并行方式执行,但排他网关只会选择一条顺序流执行。与其他网关的主要区别是,并行网关不会解析条件。
说一说activiti中的排他网关和并行网关

activiti工作流中我们经常用到的网关有两种:

1. Exclusive Gateway 排他网关

Activity并行网关和排他网关第1张

排他网关.png

排他网关(也叫异或(XOR)网关,或更技术性的叫法 基于数据的排他网关), 用来在流程中实现决策。 当流程执行到这个网关,所有外出顺序流都会被处理一遍。 其中条件
解析为true的顺序流(或者没有设置条件,概念上在顺序流上定义了一个'true') 会被选
中,让流程继续运行。

注意这里的外出顺序流 与 BPMN 2.0 通常的概念是不同的。通常情况下,所有条件结果> 为true的顺序流 都会被选中,以并行方式执行,但排他网关只会选择一条顺序流执行。
就是说,虽然多个顺序流的条件结果为true, 那么XML中的第一个顺序流(也只有这一
条)会被选中,并用来继续运行流程。 如果没有选中任何顺序流,会抛出一个异常

排他网关定义非常直接,在xml里面就一句

<exclusiveGateway   name="Exclusive Gateway" /><sequenceFlow   sourceRef="exclusiveGw" targetRef="theTask1">
 <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression></sequenceFlow><sequenceFlow   sourceRef="exclusiveGw" targetRef="theTask2">
 <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression></sequenceFlow><sequenceFlow   sourceRef="exclusiveGw" targetRef="theTask3">
 <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression></sequenceFlow>

Activity并行网关和排他网关第2张

排他网关示意图.png

上图是使用activiti modeler在线设计时候的截图

排他网关有点像java里面 if ... else if ... 每一个分支线上都要指定一个条件,可以有多条分支线,分支线的的变量需要在网关之前就设置到流程变量中。

** 举个栗子,可以在我上面图里面usertask这个节点添加一个执行监听器 **

Activity并行网关和排他网关第3张

添加执行监听器.png

Activity并行网关和排他网关第4张

添加执行监听器.png

执行监听器代码

@Service("taskFinishedLicenser")@Transactional(propagation = Propagation.NOT_SUPPORTED)public class TaskFinishedLicenser implements ExecutionListener {
  private static final long serialVersionUID = 2105979050046650949L;
  @Override
  public void notify(DelegateExecution execution){
    try{
      //set global flow varible
      execution.getEngineServices().getRuntimeService().setVariableLocal(execution.getProcessInstanceId(),"input",1);
    }catch(Exception e){
      execution.getEngineServices().getRuntimeService().setVariableLocal(execution.getProcessInstanceId(),"input",2);
      logger.error(e.getMessage());
    }
  }
}

设置了流程变量后,分支条件获取的时候就可以读取到变量了。

2. Parallel Gateway 并行网关

Activity并行网关和排他网关第5张

并行网关.png

网关也可以表示流程中的并发情况。最简单的并发网关是 并行网关,它允许将流程分成
多条分支,也可以把多条分支 汇聚到一起。
并行网关的功能是基于进入和外出的顺序流的:

  • 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

  • 汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功
能。这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

这里需要强调的是,** 并行网关一定是成对出现的,有分支也要有汇聚 **

** 一个分支执行完毕后,需要等待其他分支全部执行完流程才会走到下一个节点 **

还有一个有意思的点是,流程开始执行后,点击流程监控发现,执行到并行网关中间的节点时,当前执行节点是显示在并行网关节点上,并不会显示到中间具体的一个节点,所以activiti是把两个并行节点间的所有任务节点,看作是一个事务。

Activity并行网关和排他网关第6张

并行网关.png

<startEvent   /><sequenceFlow   sourceRef="theStart" targetRef="fork" /><parallelGateway   /><sequenceFlow sourceRef="fork" targetRef="receivePayment" /><sequenceFlow sourceRef="fork" targetRef="shipOrder" /><userTask   name="Receive Payment" /> <sequenceFlow sourceRef="receivePayment" targetRef="join" /><userTask   name="Ship Order" /> <sequenceFlow sourceRef="shipOrder" targetRef="join" /><parallelGateway   /><sequenceFlow sourceRef="join" targetRef="archiveOrder" /><userTask   name="Archive Order" /> <sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" /><endEvent   />

免责声明:文章转载自《Activity并行网关和排他网关》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何比较版本号--Python实现WPF图表库Live Charts下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c# async await 理解 结合并行处理

写两个方法 第一个 List<int> list = new List<int>(); int i= 0; do { i++; list.Add(i); } while (i< 10); Console.WriteLine("开始执行时间:" + DateTime.Now.ToString()); Parall...

《C#并发编程经典实例》笔记

1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期研读了不少书籍,其中《C#并发编程经典实例》给我的印象还是比较深刻的。当然,这可能是由于近段日子看的书大多嘴炮大于实际,如《Head First设计...

4.0中的并行计算和多线程详解(一)

  并行计算部分   沿用微软的写法,System.Threading.Tasks.::.Parallel类,提供对并行循环和区域的支持。 我们会用到的方法有For,ForEach,Invoke。   一、简单使用   首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环) Code             Pr...

Java 8 (10) CompletableFuture:组合式异步编程

https://www.cnblogs.com/baidawei/p/9447737.html   随着多核处理器的出现,提升应用程序的处理速度最有效的方式就是可以编写出发挥多核能力的软件,我们已经可以通过切分大型的任务,让每个子任务并行运行,使用线程的方式,分支/合并框架(java 7) 和并行流(java 8)来实现。 现在很多大型的互联网公司都对外...

pg10、11、12版本特性

2. 分区表的改进 PostgreSQL 10 实现了声明式分区,PostgtreSQL 11完善了功能,PostgreSQL 12提升了性能。我们知道在PostgreSQL 9.X时代需要通过表继承实现分区,这时还需要手工加触发器或规则把新插入的数据重新定向到具体的分区中,从PostgreSQL 10之后不需要这样了,直接用声明式分区就可以了,语法如下:...

java8使用parallelStream并行流造成数据丢失或下标越界异常解决方案

描述 我们先看一段使用了并行流的代码 @Test public void testStream() { List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10000; i++) { li...