工作流引擎之activiti中的排他网关和并行网关

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

Exclusive Gateway 排他网关

排他网关.png

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

注意这里的外出顺序流 与 BPMN 2.0 通常的概念是不同的。通常情况下,所有条件结果 为true的顺序流 都会被选中,以并行方式执行,但排他网关只会选择一条顺序流执行。就是说,虽然多个顺序流的条件结果为true, 那么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>

排他网关示意图.png

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

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

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

添加执行监听器.png

排他网关示意图.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());
        }
    }
}

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

Parallel Gateway并行网关

并行网关.png

网关也可以表示流程中的并发情况。最简单的并发网关是 并行网关,它允许将流程分成 多条分支,也可以把多条分支 汇聚到一起。 并行网关的功能是基于进入和外出的顺序流的: 分支: 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。 汇聚: 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。

注意,如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功 能。这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。 与其他网关的主要区别是,并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

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

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

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

并行网关.png

<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" />

原文发布于微信公众号 - Linyb极客之路(gh_c420b2cf6b47)

原文发表时间:2018-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏好好学java的技术栈

微信公众号支付开发全过程(java版)

因为微信支付需要较高的权限,只有认证了得服务号才有使用微信支付接口的权限,我们个人很难申请到,所以需要向其他朋友借用账号。

39050
来自专栏农夫安全

查找代理工具

查找代理工具:ProxyBroker https://github.com/constverum/ProxyBroker.git 为了解决大家查找代理的问题,介...

27060
来自专栏python开发者

安全防范:服务器连接及权限处理

安全防范:服务器连接及权限处理 1. 概述 直接使用密码去ssh登录服务器,容易被黑客使用密码字典暴力破解。所以开发人员要养成良好的安全习惯,从登录服务器开始:...

29850
来自专栏散尽浮华

ping监控脚本案例分析

23130
来自专栏繁花云

[实例]利用php+mysql完成shell脚本的授权验证

作者最近这几天写了一个shell脚本准备进行出售,由于单独出售利润不大,决定将脚本按照IP进行授权,出售授权,这样可以增加利润。

19700
来自专栏北京马哥教育

黑客的Linux神技能:使用环境变量进行提权

在这篇文章中,我将会为大家介绍一些使用环境变量进行Linux提权的方法,包括在CTF challenges中使用到一些的技术。话不多说,让我们进入正题!

22600
来自专栏ytkah

dedecms怎样调用指定id文章?

  前面我们聊了帝国cms如何调用指定id的文章到首页,作为同行的织梦cms应该也是可以实现的吧?那么,dedecms怎样调用指定id文章呢?使用idlist直...

87960
来自专栏嵌入式程序猿

SAE J1939 协议简介(大结局)

由于应用层会根据不同的行业和需求有所不同,所以应用层的开发可以参考标准自行研究,关于这个系列,今天是最后一集,我们来讲讲 J1939的网络管理层(J1939/8...

41180
来自专栏流柯技术学院

关于linux下DB2创建数据库报错问题

公司业务需要,把服务搭在中标下,在中标下装了DB2 Express-C v9.7.1,之前用着没有问题,隔了一段时间没用,最近又需要用到它,出了一些菜鸟问题,记...

13010
来自专栏ytkah

dedecms文章页调用地址(当前文章URL)如何操作?

  我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个...

295110

扫码关注云+社区

领取腾讯云代金券