前页 后页

示例:延迟事件模式

Enterprise Architect支持延迟事件模式。

在状态中创建延迟事件:

  1. 为国家创建自我过渡。
  2. 将过渡的“种类”更改为“内部”。
  3. 将触发器指定为要延迟的事件。
  4. 在“效果”字段中,键入“ defer();”。
模拟:
  1. 选择“模拟>动态模拟>模拟器>打开模拟窗口”。还要选择“模拟>动态模拟>事件”以打开“模拟事件”窗口。
  2. 模拟器事件窗口可帮助您触发事件;双击“等待触发器”列中的触发器。
  3. Simulation窗口以文本形式显示执行。您可以在Simulator命令行中键入“ dump”,以显示队列中延迟了多少个事件。输出可能类似于以下内容:
    24850060]事件池:[NEW,NEW,NEW,NEW,NEW,]

延迟事件示例

本示例显示了使用“延迟事件”的模型,“模拟事件”窗口显示了所有可用事件。

我们首先建立上下文(包含StateMachines的Class元素),在简单的上下文中模拟它们,并从其外部引发事件;然后使用Send事件机制在客户端-服务器上下文中进行仿真。

创建上下文和状态机

创建服务器上下文

Class diagram providing context definition in Sparx Systems Enterprise Architect

创建一个类图并:

  1. 一个Class元素TransactionServer ,向其添加StateMachine ServerStateMachine
  2. 一个Class元素TestClient ,您要在其中添加StateMachine ClientStateMachine
  3. TestClientTransactionServer的关联,目标角色名为server。

ServerStateMachine 建模 

Simple example State Machine diagram in Sparx Systems Enterprise Architect

  1. 在StateMachine图中添加一个Initial Node Initial ,然后过渡到State idle
  2. 转换(事件NEW_REQUEST作为触发器)到状态busy
  3. 过渡(使用事件QUIT作为触发)到最终状态决赛。
  4. 转换(事件AUTHORIZED作为触发器)到idle
  5. 转换为繁忙状态 (事件NEW_REQUEST作为Trigger和defer();生效)

ClientStateMachine的 建模 

Example multi-state State Machine diagram in Sparx Systems Enterprise Architect 

  1. 向StateMachine图中添加一个Initial Node Initial ,然后过渡到State State0
  2. 转换(以事件RUN_TEST作为触发器)到State State1
  3. 过渡到状态State2 (效果:%SEND_EVENT(“ NEW_REQUEST”,CONTEXT_REF(服务器))%;)
  4. 过渡到状态State3 (效果为:%SEND_EVENT(“ NEW_REQUEST”,CONTEXT_REF(server))%;)。
  5. 过渡到State State4 (效果:%BROADCAST_EVENT(“ NEW_REQUEST”)%;)。
  6. 过渡(有效果:%SEND_EVENT( “授权”,CONTEXT_REF(服务器))%),以一国State5。
  7. 过渡到决赛状态决赛。

在简单环境中进行仿真

创建仿真工件

Model Simulation with Executable StateMachine in Sparx Systems Enterprise Architect

  1. 创建名称为Simulation with Deferred Event的可执行文件StateMachine Artifact,并将“ Language”字段设置为JavaScript。
  2. 将其放大,然后按住Ctrl键并将TransactionServer元素拖动到工件上,并将其粘贴为名称服务器的属性

运行模拟

  1. 选择工件,然后选择“模拟>可执行状态>状态机>生成,构建和运行”选项,并为您的代码指定目录(注意:目录中的所有文件将在模拟开始前被删除)。
  2. 单击生成按钮。
  3. 选择“模拟>动态模拟>事件”选项,以打开“模拟事件”窗口。

当模拟开始时, 空闲将变为活动状态。

  1. 在“模拟事件”窗口中双击NEW_REQUEST以将其执行为触发器;退出空闲并激活
  2. 在“模拟事件”窗口中双击NEW_REQUEST,再次将其作为触发器执行; 繁忙保持激活状态,并且在事件池中附加了一个NEW_REQUEST实例。
  3. 在“模拟事件”窗口中双击NEW_REQUEST,以第三次执行该触发器; 繁忙保持激活状态,并且在事件池中附加了一个NEW_REQUEST实例。
  4. 在“模拟”窗口命令行中键入dump ;请注意,事件池具有两个NEW_REQUEST实例。
  5. 在“模拟事件”窗口中双击“授权”以将其作为触发器执行;这些动作发生:
    - 忙碌退出, 空闲变为活动状态
    -从池中检索到一个NEW_REQUEST事件,退出了空闲状态 ,并且忙碌状态变为活动状态
  6. 在“模拟”窗口命令行中键入dump ;现在,事件池中只有一个NEW_REQUEST实例。

通过发送/广播事件进行交互式模拟

创建仿真工件

Deferred event in business process simulation in Sparx Systems Enterprise Architect

  1. 创建一个名称为“ Interactive Simulation with Deferred Event”的“ Executable StateMachine Artifact”,并将“ Language”字段设置为JavaScript;扩大元素。
  2. Ctrl +将TransactionServer元素拖放到工件上,并将其作为属性粘贴到名称服务器。
  3. 按住Ctrl键并将TestClient元素拖放到工件上,并将其作为属性粘贴到名称client上
  4. 创建一个从客户端到 服务器的连接器。
  5. 单击连接器,然后按Ctrl + L以选择从TestClient元素到TransactionServer元素的关联。

运行交互式仿真

  1. 以与简单上下文相同的方式启动仿真。

    模拟开始后, 客户端将保持在State0 ,而服务器将保持空闲状态

  2. 在“模拟事件”窗口中双击RUN_TEST来触发它。 NEW_REQUEST事件将被触发3次(由SEND_EVENT和BROADCAST_EVENT触发),而AUTHORIZED事件将由SEND_EVENT触发一次。



    在“模拟”窗口命令行中键入dump ,事件池中还有一个NEW_REQUEST实例。结果与我们的手动触发测试相符。