活动执行

活动可以有前置条件和后置条件约束,它们从行为继承而来(参见13.2)。它们全局性的应用于活动的所有调用。(活动中的动作也可能有前置和后置条件,参见16.2。)

作为一个行为,活动可以有参数(参见13.2)。对于每一个参数,活动有一个相应的ActivityParameterNode(活动参数节点,一个inout参数有两个,一个用于输入,一个用于输出)。活动参数节点是对象节点,它使得参数值可以在活动中被访问。(参见15.4中对活动参数节点的完整讨论。)

当活动被调用时,传递给它的所有输入参数的值都被放于对象tokens中置于活动相应的活动参数节点上(如果某个输入参数没有值,在相应的活动参数节点上放置一个空token)。这些活动参数节点随后将它们的tokens交付给流出的活动边。

当活动第一次被调用时,只有输入活动参数节点持有tokens。然而,没有流入边并且不需要输入数据的节点可以立即开始执行。每一个可以执行的节点上都有一个单一的控制token,它们开始并发执行。这类节点包括不带流入控制流和没有必需输入数据的可执行节点(参见15.5)和初始节点(参见15.3)。

在活动的每次后续调用,isSingleExecution属性指示是否是相同的活动执行还是每次调用都创建一个单独的执行来处理调用的tokens。举个例子,一个生产厂的活动模型可能有一个参数指示要完成的订单。每次该活动被调用的时候,一个新订单进入制造流程。由于只有一个工厂,活动的一个执行处理所有的订单。这对于活动是一个操作方法也是适用的。

如果活动的一个执行用于所有的调用,建模者必须考虑在活动节点和活动边上移动的多个tokens流的交互。在等待之前的tokens移动到下游之前,tokens可能会达到瓶颈,由于被调用行为在执行时间上的变化,它们可能发生反超,更重要的是,可能由于到达活动结束节点而终止其它的。

如果每次调用采用一个单独的执行(缺省),不同调用的tokens不会交互。举个例子,作为分类符行为的活动在分类符被实例化的时候调用(参见13.2),建模者通常希望分类符的每个实例有一个单独的活动执行。这对于普通编程语言中方法的建模也是相同的,其中每个方法调用都有一个单独的栈片段。

然而,如果活动有流参数(参见13.2),那么即使在一个单一执行过程中额外的tokens也可能流入和流出该活动。这可能导致与使用一个单一执行相同的token交互问题。

没有流参数的活动在它没有节点执行且没有节点可以执行,或者它显式地使用活动结束节点来终结时结束。带有流输入参数的活动执行在流输入参数没有达到multiplicity下限之前不会停止。带有流输出参数的活动执行在流输出参数没有达到multiplicity下限之前不会终结。

当活动执行结束时,所有对应于非流输出参数的活动参数节点都应该至少持有相应参数multiplicity下限个非空对象tokens。与每个输出活动参数节点相关联的对象tokens的值被传出活动给相应的输出参数并对活动的调用者可用。

通过使用isException=true可以把输出参数标记为一个异常参数。提交给异常参数的输出将阻止其它的输出提交给行为的其它输出参数。当一个对象token到达一个与异常参数相关联的输出活动参数节点,那么活动的执行被立即终止。这个token上的值被传递给异常参数,但其它输出活动参数节点(非流参数)上的所有tokens都会丢失,它们的值也不会传递给关联的参数。在活动终止之前已提交给流输出参数的值不受影响。

只有在放弃活动中的所有流是希望得到的结果时才使用异常参数。举个例子,如果活动的执行用于它所有的调用(即isSingleExecution=true),那么多个tokens流会流经相同的活动。此时,很可能不希望因为一个异常输出就放弃所有的流。当采用异常参数时为活动不同的调用安排单独的执行,这样它们就不会彼此影响。

results matching ""

    No results matching ""