消息事件

消息是一次通信,其中发送者向一个接收者请求一个操作调用或信号reception。这个通信包括两个事件:发送消息的事件和接收消息的事件。然而,尽管发送事件隐含在InvocationActions(参见16.3),并且此类事件的出现可以在交互(参见17.5)中被建模,但UML没有把发送事件建模为显式的模型元素。另一方面,为了能够规定一个可以对消息事件的出现进行响应的触发器,消息事件是消息的receipt的显式模型。

一条消息包括:

  • 请求相关的数据(操作参数或信号属性的值)。
  • 请求的性质信息(例如所调用的行为特征)。
  • 对于同步调用,使得被调用行为可以返回的足够信息。

一条消息只能由一个发送对象产生并发向一个接收者对象,但一个发送事件的出现可能导致产生许多消息(类似SignalBroadcastAction,参见16.3)。消息的接收者可能与发送者相同,它可能是本地的(即,在当前执行行为或它的上下文对象的一个slot中存储的对象),也可能是远程的。消息传送的方式、传送所需的时间、到达接收对象的传送顺序和路径都是未定义的。

消息的receipt表现为一个消息事件出现。CallEvent是用于请求一个特定的操作的消息的消息事件。SignalEvent是用于请求一个特定信号实例的reception的消息的消息事件。AnyReceiveEvent是一个用于没有被任意相关的触发器显式地处理的消息的消息事件。

对于接收者上操作的CallEvent或满足一个Reception的信号的SignalEvent,如果操作或Reception有一个或多个方法,那么13.2.3中行为特征和方法所描述的方法解析过程被执行以决定用于处理该消息出现的一个方法。如果找到一个方法,那么调用它来响应消息请求。否则,该消息事件被存储到接收对象的事件池中。如果一个消息事件出现从事件池中被派发并满足接收者行为规约中定义的一个触发器,那么它在所处的行为中产生一个执行响应。

AnyReceiveEvent的触发器可以被任意消息(信号发送或操作调用)的receipt所触发。然而,如果有一个与该消息匹配的SignalEvent或CallEvent触发器,那么AnyReceiveEvent触发器不会被该消息所触发。其它哪些触发器与一个AnyReceiveEvent触发器相关联取决于触发器的上下文(特别的,参见14.2的Transitions和16.10的AcceptEventActions)。AnyReceiveEvent还可以被包含一个不是信号实例的对象的消息的receipt所触发,该消息可能是由一个SendObjectAction发送的(参见16.3.3)。

一个触发器可以规定一个或多个端口,此时触发器的事件应该是一个消息事件。此种情形下,触发器只与那些通过某个规定的端口所接收到的消息的事件出现进行匹配(参见11.3被封装分类符和端口)。

results matching ""

    No results matching ""