前页 | 后页 |
示例:延迟事件模式
Enterprise Architect支持延迟事件模式。
在一个状态下创建一个延迟事件:
- 为状态创建一个自我转换。
- 更改向“内部”过渡的“种类”。
- 简单地触发器要延迟的事件。
- 在“影响”字段中,输入“defer();”。
- 选择“仿真>动态仿真仿真>模拟器>打开仿真窗口”。同时选择“仿真>动态仿真>事件”打开仿真事件窗口。
- 模拟器事件窗口帮助您触发事件;双击“等待触发器”列中的触发器。
- 仿真窗口以文本形式显示执行过程。您可以在 Simulator 命令行中键入“dump”以显示队列中延迟了多少事件;输出可能类似于:
泳池]事件泳池:[NEW,NEW,NEW,NEW,NEW,]
延迟事件示例
此示例显示了使用延迟事件的模型,以及显示所有可用事件的仿真事件窗口。
我们首先设置上下文(包含状态机的类元素),在一个简单的上下文模拟它们并从外部引发事件;然后用上下文事件机制模拟一个客户端-服务器时间。
创建上下文和状态机
创建服务器上下文
创建类图并:
- A类元素TransactionServer ,你添加一个状态机ServerStateMachine 。
- A类元素TestClient ,向其中添加状态机ClientStateMachine 。
- 从TestClient到TransactionServer的关联,目标角色名为server。
ServerStateMachine建模
- 在状态机图中添加一个 Initial节点Initial ,并转换到一个状态idle 。
- 转移
(以事件触发器为简单)到状态忙。 - 转移
(以事件为触发器)终点状态终点 - 转移
(与事件 AUTHORIZED 一样触发器)到idle 。 - 转移
(以事件触发器作为简单和defer();作为效果)到忙
ClientStateMachine建模
- 在状态机图中添加一个 Initial节点Initial ,并转换到一个状态。
- 转移
(以事件RUN_TEST 作为触发器)到 stateState1状态 - 转移
(效果:%SEND_EVENT("NEW_REQUEST", CONTEXT_REF(server))%;) 到状态State2。 - 转移
(效果: %SEND_EVENT(" NEW_REQUEST", CONTEXT_REF(server))%;) 到 stateState3状态 - 转移
(效果: %BROADCAST_EVENT(" NEW_REQUEST")%;) 到 stateState4状态 - 转移
(效果: %SEND_EVENT("AUTHORIZED", CONTEXT_REF(server))%;)到 stateState5状态 - 转移
到终点状态终点
仿真在一个简单的上下文
创造仿真工件
- 工件and with the name仿真事件的可执行状态机将“语言”字段设置为JavaScript
- 放大 Ctrl+元素将它拖到事务服务器上,然后将其作为属性与名称服务器工件粘贴。
运行仿真
- '选择工件编译仿真生成运行指定一个目录为你的(注记:目录中的所有文件将在模拟开始之前)。
- 点击生成按钮。
- 选择“仿真>动态仿真>事件”选项打开仿真事件窗口。
模拟开始时, idle将是活动状态。
- 双击触发器仿真将其作为事件简单的窗口执行;退出空闲并激活忙碌。
- 双击仿真窗口中的仿真,再次像事件一样触发器; busy保持激活状态,并且泳池的实例被附加到事件池中。
- 双击仿真事件窗口中的仿真,第三次执行触发器事件; busy保持激活状态,并且泳池的实例被附加到事件池中。
- 仿真窗口命令行中的类型转储;请注意,事件池有两个 NEW_REQUEST 实例。
- 双击触发器仿真中的AUTHORIZED,将其作为事件模拟窗口执行;这些行动发生:
-busy退出, idle变为活动状态
- 从池中检索 NEW_REQUEST 事件,退出空闲并且忙碌变为活动状态 - 仿真窗口命令行中的类型转储;现在事件泳池只有一个现在实例。
通过发送/广播事件进行交互模拟
创造仿真工件
- 使用名称创建事件仿真状态并可执行状态机到工件JavaScript “语言”字段集的名称放大元素。
- 将TransactionServer元素工件属性上,并将其粘贴为名称服务器。
- Ctrl+工件将TestClient元素拖到属性上,并将其粘贴为名称client 。
- 创建从客户端到服务器的连接器。
- 单击连接器并按 以选择从TestClient元素到TransactionServer元素的关联。
运行互动仿真
- 以与简单上下文相同的方式启动模拟。
模拟开始后,客户端保持在State0而服务器保持在空闲状态。
- 双击仿真事件窗口中的 RUN_TEST 即可触发。事件 NEW_REQUEST 将被触发 3 次(由 SEND_EVENT 和 BROADCAST_EVENT),而 AUTHORIZED 将由 SEND_EVENT 触发一次。
仿真窗口命令行中的类型转储,事件池中只剩下一个泳池实例。结果与我们的手动触发测试相匹配。