允许加入节点的多个事件操作

问题描述

是否允许在一个加入节点使用多个事件,如下所示。

或者是想象中的标记,它可以用来描述一个活动流程,就在第二个事件出现之前就消失了?

enter image description here

解决方法

是否允许在一个加入节点使用多个事件

是的,JoinNode 是同步多个流的 ControlNode

是想象中的标记,可以用来描述一个活动流,在第二个事件出现之前就消失了

在连接未通过时,传入边上提供的令牌被阻止,JoinNode 通过的时刻取决于它的 joinSpec :

  • 如果 JoinNode 没有 joinSpec,那么这相当于带有布尔运算符“and”的 joinSpec 表达式。也就是说,隐含的默认 joinSpec 条件是每个传入的 ActivityEdge
  • 至少提供一个令牌
  • 否则 joinSpec 它是一个 ValueSpecification 确定连接将发出令牌的条件,然后在每个传入时至少提供一个令牌时不需要ActivityEdge。每当向任何传入 ActivityEdge 上的 JoinNode 提供新令牌时,都会评估此 ValueSpecification

欲了解更多信息,请参阅 formal/2017-12-05 的 §15.3.3.4 加入节点页面 389:

JoinNode 是同步多个流的 ControlNode。一个 JoinNode 应该正好有一个传出 ActivityEdge 但可能有多个传入的 ActivityEdge。如果 JoinNode 的任何传入边是 ObjectFlows,输出边缘应为 ObjectFlow。否则,输出边缘应为 ControlFlow。

Join 节点可能有一个 joinSpec,它是一个 ValueSpecification,它决定了加入的条件 发出一个令牌。

如果一个 JoinNode 有一个 joinSpec,那么每当一个新的令牌被提供给这个 ValueSpecification 任何传入 ActivityEdge 上的 JoinNode。此评估不应被期间提供的任何新代币中断 在评估期间提供新代币时,也不得同时开始评估。这 ValueSpecification 应评估为布尔值。

如果 joinSpec ValueSpecification 由文本表达式给出,则传入边的名称可用于 表示一个布尔值,指示来自 ControlFlow 的报价的存在 (true) 或不存在 (false) 或表示 与从 ObjectFlow(如果有)提供的对象令牌相关联的值。或者,joinSpec 可能包含一个 具有单个布尔运算符名称且未指定操作数的表达式。在这种情况下,joinSpec 的值 应通过将给定的运算符应用于指示存在 (true) 或不存在 (false) 的布尔值来给出 在每个传入边上提供(未指定操作数的顺序)。

如果 JoinNode 没有 joinSpec,那么这相当于带有布尔运算符“and”的 joinSpec 表达式。 也就是说,隐含的默认 joinSpec 条件是在每个传入的 ActivityEdge 上至少提供一个令牌。

如果 JoinNode 的(隐式或显式)joinSpec 评估为真,则在传出 ActivityEdge 上提供令牌 JoinNode 根据以下规则:

  • 如果传入边上提供的所有令牌都是控制令牌,则在传入边上提供一个控制令牌 输出边缘。
  • 如果传入边上提供的某些令牌是控制令牌而其他令牌是对象令牌,则只有 对象令牌在传出边缘提供。令牌以相同的顺序在传出边缘提供 他们被邀请加入。如果JoinNode 的isCombinedDuplicate 为真,则在对象标记之前 提供给传出边缘的那些包含具有相同身份的对象的对象被合并为一个令牌。

以上规则适用于所有提供给 JoinNode 的代币,包括来自同一个传入的多个代币 边缘。

如果向 JoinNode 的传出 ActivityEdge 提供任何令牌,它们将被目标接受或拒绝 在向传出边缘提供更多令牌之前遍历边缘(例如,由于防护失败)。如果令牌是 被拒绝遍历,它们将不再提供给输出边缘。符合要求的实现可能会省略 如果 JoinNode 被阻止在其传出边缘提供令牌,则不必要的 joinSpec 评估。