首页 > 编程知识 正文

网关协议,java工作流框架哪个好

时间:2023-05-06 09:36:11 阅读:130951 作者:586

8.3.5 .默认序列流

说明

所有BPMN 2.0任务和网关默认顺序流(default sequence flow)只有在没有其他序列流可供选择时,缺省序列流才会被选择为活动的出口序列流。 进程将忽略默认序列流上的条件。

图标

缺省序列流由起点带正斜线标记的常规序列流表示。

XML表示

活动的缺省序列流由活动的default属性定义。 以下XML片段显示了具有默认序列流flow 2的独占网关。 只有当conditionA和conditionB都计算为false时,才会选择默认的顺序流作为网关的出口顺序流。

1 2 3 4 5 6 7 8 9 10 11

exclusivegatewayid=' exclusive GW ' name=' exclusive gateway ' default=' flow2'/sequence flowid=' flow1' sourceref=' exclusive GW ' target ref=' task1' conditionexpressionxsi 3360 type=' tformalexprexpresss sequenceflowsequenceflowid=' flow2' sourceref=' exclusive GW ' target ref=' task2'/sequence flowid=' flow3' sourcererer

8.4 .网关(网关)用于控制运行流程)或BPMN 2.0术语:按运行“标志”token )。 网关可以建立消费(consuming )和生成(consuming )标志。

网关由带图标的菱形表示。 此图标指示网关的类型。

8.4.1 .排他网关

说明

独占网关(exclusive gateway )异或网关XOR gateway或更专业的基于数据的独占网关(exclusive data-based gateway )是该过程中的http://到达此网关后,将按照所有出口序列流中定义的顺序进行计算。 选择第一个条件计算为true的序列流,如果未设置条件,则认为true,然后继续该过程。

决策

图标

独占网关由内部带有“x”图标的标准网关(菱形)表示,“x”图标表示异或的含义。 请注意,内部没有图标的网关默认为独占网关。 BPMN 2.0规范不能在同一过程中混合使用带有x的菱形标记和没有x的菱形标记。

XML表示

排他网关的XML表示形式很简洁。 在一行中定义网关的XML。 表达式在其出口顺序流中定义。 有关此表达式中可用选项的信息,请参阅条件序列流一章。

以下面的模型为例。

该XML表示为:

1 2 3 4 5 6 7 8 9 10 11 12 13

exclusivegatewayid=' exclusive GW ' name=' exclusive gateway '/sequence flowid=' flow2' sourceref=' exclusive GW ' target ref=' the task1' conditionexpressionxsi 3360 type=' tformalexppppp sequenceflowsequenceflowid=' flow3' sourceref=' exclusive GW ' target ref=' the task2' conditionexpresssionxsi 360 type=

flow4" sourceRef="exclusiveGw" targetRef="theTask3"> <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression> </sequenceFlow>

8.4.2. 并行网关

描述

网关也可以建模流程中的并行执行。在流程模型中引入并行的最简单的网关,就是并行网关(parallel gateway)。它可以将执行分支(fork)为多条路径,也可以合并(join)多条入口路径的执行。

并行网关的功能取决于其入口与出口顺序流:

分支:所有的出口顺序流都并行执行,为每一条顺序流创建一个并行执行。

合并:所有到达并行网关的并行执行都会在网关处等待,直到每一条入口顺序流都到达了有个执行。然后流程经过该合并网关继续。

请注意,如果并行网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有入口顺序流,然后分裂为多条并行执行路径。

与其他网关类型有一个重要区别:并行网关不计算条件。如果连接到并行网关的顺序流上定义了条件,会直接忽略该条件。

图示

并行网关,用内部带有’加号’图标的网关(菱形)表示,代表与(AND)的含义。

XML表示

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

 

1

<parallelGateway id="myParallelGateway" />

实际行为(分支,合并或两者皆有),由连接到该并行网关的顺序流定义。

例如,上面的模型表示为下面的XML:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

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

在上面的例子中,当流程启动后会创建两个任务:

 

1 2 3 4 5 6 7 8 9 10 11 12 13

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());

当这两个任务完成后,第二个并行网关会合并这两个执行。由于它只有一条出口顺序流,因此就不会再创建并行执行路径,而只是激活Archive Order(存档订单)任务。

请注意并行网关不需要“平衡”(也就是说,前后对应的两个并行网关,其入口/出口顺序流的数量不需要一致)。每个并行网关都会简单地等待所有入口顺序流,并为每一条出口顺序流创建并行执行,而不受流程模型中的其他结构影响。因此,下面的流程在BPMN 2.0中是合法的:

8.4.3. 包容网关

描述

可以把包容网关(inclusive gateway)看做排他网关与并行网关的组合。与排他网关一样,可以在包容网关的出口顺序流上定义条件,包容网关会计算条件。然而主要的区别是,包容网关与并行网关一样,可以同时选择多于一条出口顺序流。

包容网关的功能取决于其入口与出口顺序流:

分支:流程会计算所有出口顺序流的条件。对于每一条计算为true的顺序流,流程都会创建一个并行执行。

合并:所有到达包容网关的并行执行,都会在网关处等待。直到每一条具有流程标志(process token)的入口顺序流,都有一个执行到达。这是与并行网关的重要区别。换句话说,包容网关只会等待可以被执行的入口顺序流。在合并后,流程穿过合并并行网关继续。

请注意,如果包容网关同时具有多条入口与出口顺序流,可以同时具有分支与合并的行为。在这种情况下,网关首先合并所有具有流程标志的入口顺序流,然后为每一个条件计算为true的出口顺序流分裂出并行执行路径。

包容网关的汇聚行为比并行网关更复杂。所有到达包容网关的并行执行,都会在网关等待,直到所有“可以到达”包容网关的执行都“到达”包容网关。 判断方法为:计算当前流程实例中的所有执行,检查从其位置是否有一条到达包容网关的路径(忽略顺序流上的任何条件)。如果存在这样的执行(可到达但尚未到达),则不会触发包容网关的汇聚行为。

— 译者附(翻译自alfresco文档 http://docs.alfresco.com/process-services1.6/topics/inclusive_gateway.html)

图示

包容网关,用内部带有’圆圈’图标的网关(菱形)表示。

XML表示

定义包容网关需要一行XML:

 

1

<inclusiveGateway id="myInclusiveGateway" />

实际行为(分支,合并或两者皆有),由连接到该包容网关的顺序流定义。

例如,上面的模型表现为下面的XML:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

<startEvent id="theStart" /> <sequenceFlow id="flow1" sourceRef="theStart" targetRef="fork" /> <inclusiveGateway id="fork" /> <sequenceFlow sourceRef="fork" targetRef="receivePayment" > <conditionExpression xsi:type="tFormalExpression">${paymentReceived == false}</conditionExpression> </sequenceFlow> <sequenceFlow sourceRef="fork" targetRef="shipOrder" > <conditionExpression xsi:type="tFormalExpression">${shipOrder == true}</conditionExpression> </sequenceFlow> <userTask id="receivePayment" name="Receive Payment" /> <sequenceFlow sourceRef="receivePayment" targetRef="join" /> <userTask id="shipOrder" name="Ship Order" /> <sequenceFlow sourceRef="shipOrder" targetRef="join" /> <inclusiveGateway id="join" /> <sequenceFlow sourceRef="join" targetRef="archiveOrder" /> <userTask id="archiveOrder" name="Archive Order" /> <sequenceFlow sourceRef="archiveOrder" targetRef="theEnd" /> <endEvent id="theEnd" />

在上面的例子中,当流程启动后,如果流程变量paymentReceived == false且shipOrder == true,会创建两个任务。如果只有一个流程变量等于true,则只会创建一个任务。如果没有条件计算为true,会抛出异常(可通过指定默出口顺序流避免)。在下面的例子中,只会创建ship order(传递订单)一个任务:

 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

HashMap<String, Object> variableMap = new HashMap<String, Object>(); variableMap.put("receivedPayment", true); variableMap.put("shipOrder", true); ProcessInstance pi = runtimeService.startProcessInstanceByKey("forkJoin"); TaskQuery query = taskService.createTaskQuery() .processInstanceId(pi.getId()) .orderByTaskName() .asc(); List<Task> tasks = query.list(); assertEquals(1, tasks.size()); Task task = tasks.get(0); assertEquals("Ship Order", task.getName());

当这个任务完成后,第二个包容网关会合并这两个执行。并且由于它只有一条出口顺序流,所有不会再创建并行执行路径,而只会激活Archive Order(存档订单)任务。

请注意包容网关不需要“平衡”(也就是说,对应的包容网关,其入口/出口顺序流的数量不需要匹配)。包容网关会简单地等待所有入口顺序流,并为每一条出口顺序流创建并行执行,不受流程模型中的其他结构影响。

请注意包容网关不需要“平衡”(也就是说,前后对应的两个包容网关,其入口/出口顺序流的数量不需要一致)。每个包容网关都会简单地等待所有入口顺序流,并为每一条出口顺序流创建并行执行,不受流程模型中的其他结构影响。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。