遅延イベント

<< 目次を表示 >>

ページ位置:  シミュレーション > 外部実行の状態マシン >

遅延イベント

外部実行の状態マシンによるシミュレーション機能では、遅延イベント(発行されたイベントを内部で保持しておき、後の段階でそのイベントを必要とする遷移が発生した場合に保持したイベントを発行する仕組み)に対応しています。

 

 

状態内に遅延イベントを定義する

#

操作方法

1

対象の状態に自分自身への遷移を作成します。

2

遷移のプロパティの kind internal に設定します。

3

遅延させたいイベントをトリガとして設定します。

4

アクションの欄に"defer();"と入力します。

 

 

シミュレーションを実行する

#

操作方法

1

「シミュレーション」リボン内の「共通」パネルから 「ウィンドウ」 および 「トリガ」  を実行し、シミュレーションサブウィンドウとシミュレーショントリガサブウィンドウを表示します。

2

シミュレーショントリガサブウィンドウからは、要求されているトリガ欄の内容をダブルクリックして、トリガを発行できます。

3

シミュレーションサブウィンドウ内には入力欄があります。この欄に、"dump"と入力することで、シミュレーションの状況を出力できます。この出力内に遅延しているイベントの情報も出力されます。以下はその例です。

[24850060]      Event Pool: [NEW,NEW,NEW,NEW,NEW,]

 

 

遅延イベントの利用例

この例では、具体的な遅延イベントの利用例を通して、この機能を説明します。

まず、状態マシンを持つクラス要素を作成してシミュレーションを実行し、外部からトリガを発行します。クライアントとサーバの構成を作成します。

 

 

クラス要素と状態マシンの定義

 

サーバ側の構成の定義

#

操作方法

1

クラス図を作成します。

2

クラス要素TransactionServerには、状態マシンServerStateMachineを追加します。

3

クラス要素TestClientには、状態マシンClientStateMachineを追加します。

4

そして、TestClientからTransactionServerへの関連を作成します。ターゲット側の関連端名をserverとします。

 

 

ServerStateMachine のモデリング

#

操作方法

1

開始状態を作成し、状態idleへの遷移を作成します。

2

状態idleには、状態busyへの遷移(トリガNEW_REQUEST)を作成します。

3

状態idleには、状態busyへの遷移(トリガNEW_REQUEST)を作成します。

  • 遷移 (トリガQUIT) は終了状態へ
  • 遷移 (トリガAUTHORIZED) は状態idleへ
  • 内部遷移 (トリガNEW_REQUEST, アクションとしてdefer();) は状態busyへ

 

 

ClientStateMachineのモデリング

#

操作方法

1

開始状態を作成し、状態State0への遷移を作成します。

2

状態 State0には、状態State1への遷移(トリガ RUN_TEST)を作成します。

3

状態 State1には、状態State2への遷移(アクション %SEND_EVENT("NEW_REQUEST", CONTEXT_REF(server))%)を作成します。

4

状態 State2には、状態State3への遷移(アクション  %SEND_EVENT("NEW_REQUEST", CONTEXT_REF(server))%)を作成します。

5

状態 State3には、状態State4への遷移(アクション %BROADCAST_EVENT("NEW_REQUEST")%)を作成します。

6

状態 State4には、状態State5への遷移(アクション %SEND_EVENT("AUTHORIZED", CONTEXT_REF(server))%)を作成します。

7

状態 State5は終了状態へ

 

 

シミュレーションの定義

 

外部実行の状態マシン要素の作成

#

操作方法

1

外部実行の状態マシン要素を作成します。言語はJavaScriptとします。

2

TransactionServerクラスをパート要素として配置します。

 

 

シミュレーションの実行

#

操作方法

1

外部実行の状態マシン要素を選択した状態で、「シミュレーション」リボン内の「外部実行」パネルにある「状態マシン」ボタンを押し、「生成・ビルドと実行」 を選択します。

2

リボンから シミュレーション > トリガ を実行し、サブウィンドウを開きます。

 

 

シミュレーションを実行すると、idle状態で停止します。

 

 

#

操作方法

1

トリガ NEW_REQUEST を発行すると、状態busyに遷移します。

 

 

#

操作方法

2

トリガ NEW_REQUESTを発行すると、 NEW_REQUESTは遅延イベントとして保持されます。

3

さらにトリガ NEW_REQUESTを発行すると、 NEW_REQUESTは遅延イベントとして保持されます。

4

シミュレーションサブウィンドウで dump コマンドを実行すると、2つの NEW_REQUESTトリガが遅延されていることがわかります。

 

 

 

#

操作方法

5

トリガ AUTHORIZED を実行すると、次のような動作になります。

  • 状態idleに遷移します。
  • 遅延していたトリガ NEW_REQUEST が有効になり、状態busyに遷移します。

6

シミュレーションサブウィンドウで dump コマンドを実行します。

  • トリガ NEW_REQUEST が1つのみ保持されています。

 

 

 

 

イベントのSendやBroadcastを利用したシミュレーション

 

外部実行の状態マシン要素の作成

#

操作方法

1

外部実行の状態マシン要素を作成します。言語はJavaScriptとします。

2

TransactionServerクラスをパート要素として配置します。

3

TestClientクラスをパート要素として配置します。

4

2つのパート要素をコネクタで結びます。

5

接続を選択して Ctrl+L を押し、TestClient要素からTransactionServer要素への接続と結びつけます。

 

シミュレーションの実行

#

操作方法

1

先ほどの例と同じように、シミュレーションを実行します。実行すると、状態 State0 および idle で停止します。

 

 

#

操作方法

2

トリガ RUN_TEST を発行すると、トリガ NEW_REQUEST が自動的に3回発行され、その後 AUTHORIZED が SEND_EVENT で発行されます。

 

 

 

シミュレーションサブウィンドウで dump コマンドを実行すると、トリガ NEW_REQUEST が1つのみ保持されています。これは、最初の手作業でのシミュレーションと同じ結果です。