网关用于控制执行流程(或者BPMN 2.0描述的执行令牌)。网关能够消费或生成令牌。

一个网关被图形化地显示为一个菱形,里面有一个图标。该图标显示网关的类型。

1、独家网关

描述

独占网关(也称XOR网关或更专业的基于数据的网关)用于对流程中的决策进行建模。当执行到达这个网关时,所有流出的序列流将按照它们被定义的顺序进行评估。选择条件评估为真的第一个序列流(或者没有条件集,概念上在序列流中定义了“真”)被选择用于继续该过程。

请注意,在这种情况下,输出序列流的语义与BPMN 2.0中的一般情况的语义不同。一般情况下,所有条件评估为真的序列流被选择为以并行方式继续,而在使用专用网关时只选择一个序列流。如果多个序列流具有评估为真的条件,则选择在XML中定义的第一个(并且只有那个!)来继续该过程。如果没有顺序流程可以选择,将会抛出异常。

图形表示法

独家网关被视为一个典型的网关(菱形),里面有一个X图标,指的是XOR语义。请注意,没有图标的网关默认为独占网关。BPMN 2.0规范不允许在同一个进程定义中使用有和没有X的菱形块。

XML表示

独占网关的XML表示法是直接的:一行定义在出站序列流上定义的网关和条件表达式。查看有关条件顺序流程的部分,查看哪些选项可用于此类表达式。

以下面的模型为例:

其中用XML表示如下:

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

2、并行网关

描述

网关也可以用来模拟进程中的并发。最直接的网关中的过程模型介绍并发性,是并行网关,它允许你叉成多个执行路径或加入执行的多个传入路径。

并行网关的功能基于输入和输出序列流:

  • fork:并行执行所有外发序列流,为每个序列流创建一个并发执行。
  • 连接:到达并行网关的所有并发执行都在网关中等待,直到对每个传入序列流执行完毕。然后该过程继续经过加入的网关。

请注意,如果并行网关具有多个传入和传出序列流,并行网关可以同时具有分叉和连接行为。在这种情况下,网关将首先加入所有传入的序列流,然后再分解为多个并发执行路径。

与其他网关类型的一个重要区别是并行网关不评估条件。如果在与并行网关连接的顺序流上定义条件,则简单地忽略它们。

图形表示法

一个并行网关可视化为带有加号的网关(钻石形状),引用AND语义。

XML表示

定义并行网关需要一行XML:

<parallelGateway id="myParallelGateway" />

实际行为(fork,join或both)由连接到并行网关的序列流定义。

例如,上面的模型归结为以下XML:

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

在上面的例子中,过程开始后,将创建两个任务:

ProcessInstance pi=runtimeService.startProcessInstanceByKey("forkJoin");TaskQuery query=taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();List<Task> tasks=query.list();assertEquals(2,tasks.size());Task task1=tasks.get(0);assertEquals("Receive Payment",task1.getName());Task task2=tasks.get(1);assertEquals("Ship Order",task2.getName());

当这两个任务完成后,第二个并行网关将加入这两个执行,并且由于只有一个输出序列流,因此不会创建并发执行路径,只有存档命令任务处于活动状态。

请注意,并行网关不需要平衡(相应并行网关的输入/输出序列流的匹配数量)。并行网关将简单地等待所有进入的序列流,并为每个流出的序列流创建一个并发执行路径,而不受流程模型中其他构造的影响。因此,以下过程在BPMN 2.0中是合法的:

上面文章来自盘古BPM研究院:http://vue.pangubpm.com/
文章翻译提交:https://github.com/qiudaoke/flowable-userguide
了解更多文章可以关注微信公众号:

Flowable入门系列文章39 - 网关 01相关推荐

  1. Flowable入门系列文章41 - 网关 03

    基于事件的网关 描述 基于事件的网关提供了一种基于事件做出决定的方式.网关的每个出站序列流都需要连接到中间捕获事件.当进程执行到达一个基于事件的网关时,网关就像一个等待状态:暂停执行.另外,对于每个外 ...

  2. Flowable入门系列文章193 - 禁用批量插入和安全脚本

    1.禁用批量插入 默认情况下,引擎将在批量插入中将同一数据库表的多个插入语句组合在一起,从而提高性能.已经针对所有支持的数据库进行了测试和实施. 但是,它可能是受支持和测试过的数据库的特定版本,不允许 ...

  3. Flowable入门系列文章11 - Flowable API 01

    1.Process Engine API和服务 引擎API是与Flowable进行交互的最常见的方式.主要的出发点是ProcessEngine,可以按照配置部分所述的几种方式创建 .从 Process ...

  4. Flowable入门系列文章90 - 一般可流动的REST原则 01

    1.安装和认证 Flowable包含一个REST API给Flowable引擎,可以通过将flowable-rest.war文件部署到像Apache Tomcat这样的servlet容器来安装.但是, ...

  5. Flowable入门系列文章25 - Activity解读 01

    事件被用来模拟流程生命周期中发生的事情.事件总是被视为一个圆圈.在BPMN 2.0中,存在两个主要事件类别:捕捉事件和抛出事件. 捕捉:当进程执行到达事件时,它将等待触发器发生.触发器的类型由XML中 ...

  6. Flowable入门系列文章86 - Flowable Modeler应用程序

    Flowable Modeler应用程序可用于对BPMN流程,DMN决策表,表单定义和创建应用程序定义进行建模.BPMN建模人员使用与Flowable 5 中相同的Oryx和Angular基础,但是现 ...

  7. Flowable入门系列文章10 - 基本配置四

    1.映射的诊断上下文 Flowable支持SLF4j的Mapped Diagnostic Contexts功能.这些基本的信息会被传递到底层的记录器,以及将要记录的内容: processDefinit ...

  8. Flowable入门系列文章47 - 电子邮件任务

    Flowable允许您通过向一个或多个收件人发送电子邮件的自动邮件服务任务来增强业务流程,包括支持cc,bcc,HTML内容等.请注意,邮件任务不是 BPMN 2.0规范的正式任务(因此没有专门的图标 ...

  9. Flowable入门系列文章195 - JMX的组态和服务URL

    1.组态 JMX使用默认配置,以便于使用最常用的配置进行部署.但是,更改默认配置很容易.您可以通过编程或通过配置文件来完成.下面的代码片段显示了如何在配置文件中完成这个工作: <bean id= ...

  10. Flowable入门系列文章35 - Activity解读 11

    1.消息中间捕捉事件 描述 中间捕获 消息事件捕获具有指定名称的消息. 图形表示法 中间捕捉消息事件可视化为一个典型的中间事件(圆圈内有较小的圆圈),里面有消息图标.消息图标是白色(未填充),以指示其 ...

最新文章

  1. k均值聚类算法考试例题_K-均值聚类法实例解析
  2. webpack 最简打包结果分析
  3. 软银机器人Pepper上岗必胜客,顾客可通过机器人预订披萨
  4. 谈谈Javascript闭包
  5. 值类型与引用类型(下)
  6. dwz框架中动态添加查找带回组件
  7. JfreeChart(八)之甘特图
  8. 十一、Python第十一课——用户输入和另一种循环(While)
  9. treeset java_Java TreeSet add()方法与示例
  10. 中国传统纹样背景素材|一眼识别东方韵之美
  11. jQuery 实现菜单
  12. Linux部署Web项目小记
  13. 中国网络空间安全协会成立 永信至诚等200家单位共建网络安全
  14. PreScan、Carsim、Carmaker和VTD联合仿真
  15. Java生成UUID方式
  16. U盘文件夹被隐藏能够解决方法
  17. 数据库.数据库管理系统.数据库系统三者之间的关系
  18. 阿里云张新涛:支持沉浸式体验应用快速落地,阿里云云XR平台发布
  19. 日语动词的て形歌,歌词
  20. HTML5 小组 北京站 沙龙

热门文章

  1. phpmail通过qq发邮箱失败_PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件
  2. windows家庭版关闭windows defender
  3. html语言span标签,html 中span标签里面都能放那些标签??
  4. 【python数据挖掘课程】二十七.基于SVM分类器的红酒数据分析
  5. 双显示器无法加载第二个
  6. w7设置双显示器_win7系统设置双显示器多屏幕模式的操作方法
  7. topcoder使用介绍
  8. Word怎么删除页眉页尾
  9. Maven实战 Item4 -- Maven核心概念
  10. 香农公式说明了什么_香农公式理解