首页 > 解决方案 > 允许加入节点的多个事件操作

问题描述

是否允许在一个连接节点上使用多个事件,如下图所示。

或者是可以用来描述活动流程的虚构标记,在第二个事件出现之前就已经存在并消失了?

在此处输入图像描述

标签: umlsysml

解决方案


是否允许在一个连接节点上使用多个事件

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

是虚构的标记,可以用来描述一个活动流,在第二个事件出现之前就在那里并消失了

当连接没有通过时,传入边缘上提供的令牌被阻塞,JoinNode通过的时刻取决于它的joinSpec

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

有关更多信息,这里是正式/ 2017-12-05 的 §15.3.3.4 加入节点第 389 页的副本:

JoinNode 是同步多个流的 ControlNode。一个 JoinNode 应该只有一个传出的 ActivityEdge,但可能有多个传入的 ActivityEdge。如果 JoinNode 的任何传入边是 ObjectFlow,则传出边应是 ObjectFlow。否则,出边将是一个控制流。

连接节点可能有一个 joinSpec,它是一个 ValueSpecification,它确定连接发出令牌的条件。

如果一个 JoinNode 有一个 joinSpec,那么只要在任何传入的 ActivityEdge 上向 JoinNode 提供一个新令牌,就会评估这个 ValueSpecification。评估期间提供的任何新代币都不会中断该评估,也不得在评估期间提供新代币时启动并行评估。ValueSpecification 应评估为布尔值。

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

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

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

  • 如果在输入边上提供的所有令牌都是控制令牌,则在输出边上提供一个控制令牌。
  • 如果在传入边上提供的一些令牌是控制令牌,而其他令牌是对象令牌,则在传出边上只提供对象令牌。令牌在传出边缘上提供的顺序与它们提供给连接的顺序相同。如果 JoinNode 的 isCombinedDuplicate 为真,则在将对象令牌提供给传出边之前,将包含具有相同标识的对象的那些对象组合成一个令牌。

上述规则适用于提供给 JoinNode 的所有令牌,包括从同一传入边缘提供的多个令牌。

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


推荐阅读