# demo08 **Repository Path**: Flowable_BPMN/demo08 ## Basic Information - **Project Name**: demo08 - **Description**: 网关实践:排他网关、并行网关、包容网关、基于事件的网关 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 5 - **Created**: 2019-01-29 - **Last Updated**: 2023-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ------ 环境: [jkd8+]() [mysql5.6+]() [flowable6.4.0]() # 1、原理 ## 1.1 排他网关 **排他网关**(也称为*XOR网关*或更专业的*基于数据*的*排他网关*)用于对流程中的**决策**建模。当执行到达此网关时,将按照定义它们的顺序评估所有传出序列流。选择条件评估为真(或没有条件集,在概念上具有在序列流上定义的*'真'*)的第一序列流以继续该过程。 **注意**,在这种情况下,输出序列流的语义与BPMN 2.0中的一般情况的语义不同。通常,选择条件评估为真的所有序列流以并行方式继续,而在使用排他网关时仅选择一个序列流。如果多个序列流具有计算结果为true的条件,则选择XML中定义的第一个(并且只有那个!)以继续该过程。如果不能选择序列流,则会抛出异常 ## 1.2 并行网关 **并行网关**还可用于对流程中的并发进行建模。在流程模型中引入并发性的最直接的网关是**并行网关**,它允许您*分叉*到多个执行路径或*连接*多个传入的执行路径。 并行网关的功能基于传入和传出顺序流: - **fork:**并行执行所有传出序列流,为每个序列流创建一个并发执行。 - **join:**到达并行网关的所有并发执行在网关中等待,直到每个传入的序列流都到达执行。然后,该过程继续经过加入网关。 请注意,如果同一并行网关有多个传入和传出顺序流,并行网关可以**同时具有分叉和连接行为**。在这种情况下,网关将首先连接所有传入的序列流,然后再分成多个并发的执行路径。 ## 1.3 包容网关 可以把**包容网关(inclusive gateway)**看做排他网关与并行网关的组合。与排他网关一样,可以在包容网关的出口顺序流上定义条件,包容网关会计算条件。然而主要的区别是,包容网关与并行网关一样,可以同时选择多于一条出口顺序流。 包容网关的功能取决于其入口与出口顺序流: - **分支:**流程会计算所有出口顺序流的条件。对于每一条计算为true的顺序流,流程都会创建一个并行执行。 - **合并:**所有到达包容网关的并行执行,都会在网关处等待。直到每一条具有流程标志(process token)的入口顺序流,都有一个执行到达。这是与并行网关的重要区别。换句话说,包容网关只会等待可以被执行的入口顺序流。在合并后,流程穿过合并并行网关继续。 请注意,如果包容网关同时具有多条入口与出口顺序流,可以**同时具有分支与合并的行为**。在这种情况下,网关首先合并所有具有流程标志的入口顺序流,然后为每一个条件计算为true的出口顺序流分裂出并行执行路径。 > 包容网关的汇聚行为比并行网关更复杂。所有到达包容网关的并行执行,都会在网关等待,直到所有“可以到达”包容网关的执行都“到达”包容网关。 判断方法为:计算当前流程实例中的所有执行,检查从其位置是否有一条到达包容网关的路径(忽略顺序流上的任何条件)。如果存在这样的执行(可到达但尚未到达),则不会触发包容网关的汇聚行为。 ## 1.4 基于事件的网关 基于事件的网关(event-based gateway)提供了根据事件做选择的方式。网关的每一条出口顺序流都需要连接至一个捕获中间事件。当流程执行到达基于事件的网关时,与等待状态类似,网关会暂停执行,并且为每一条出口顺序流创建一个事件订阅。 请注意:基于事件的网关的出口顺序流与一般的顺序流不同。这些顺序流从不实际**执行**。相反,它们用于告知流程引擎:当执行到达一个基于事件的网关时,需要订阅什么事件。有以下限制: - 一个基于事件的网关,必须有两条或更多的出口顺序流。 - 基于事件的网关,只能连接至`intermediateCatchEvent(捕获中间事件)`类型的元素(Flowable不支持在基于事件的网关之后连接“接收任务 Receive Task”)。 - 连接至基于事件的网关的`intermediateCatchEvent`,必须只有一个入口顺序流。 # 2、流程图 - 排他网关 ![](./images/exclusivegateway.png) - 并行网关 ![](./images/parallelgateway.png) - 包含网关 ![](./images/inclusivegateway.png) - 基于事件的网关 ![](./images/baseeventgateway.png) # 3、配置 ## 3.1 排他网关 ```xml ``` ## 3.2 并行网关 ```xml ... ``` ## 3.3 包含网关 ```xml ``` ## 3.4 基于事件的网关 ```xml ``` # 4、测试 ## 4.1 排他网关 - 运行demo - 查看数据库表 ```sql SELECT * FROM flowable.ACT_RU_EXECUTION; SELECT * FROM flowable.ACT_RU_TASK; ``` ## 4.2 并行网关 - 运行demo - 查看数据库表 ```sql SELECT * FROM flowable.ACT_RU_EXECUTION; SELECT * FROM flowable.ACT_RU_TASK; ``` ## 4.3 包含网关 ​ 在上面的示例中,在启动流程后,如果流程变量paymentReceived== false和shipOrder == true,则将创建两个任务。如果这些过程变量中只有一个等于true,则只创建一个任务。如果没有条件计算为true,则抛出异常。这可以通过指定默认的传出顺序流来防止。 ## 4.4 基于事件的网关 ​ 当执行到达基于事件的网关时,流程执行暂停。流程实例订阅alert信号事件,并创建一个10分钟后触发的定时器。流程引擎会等待10分钟,并同时等待信号事件。如果信号在10分钟内触发,则会取消定时器,流程沿着信号继续执行,激活Handle alert用户任务。如果10分钟内没有触发信号,则会继续执行,并取消信号订阅。