前回は状態機械のヒストリー機能を用いて保留機能をモデル定義し、Kaleidox上で動作させました。
ここまで取り扱ってきた状態機械は、ローバルなスコープとなっていて、発生した該当イベントの全てに反応するものでした。
システム上に状態機械が1つしかない応用の場合はこれでよいですが、システムのリソースごとに状態機械を持ちたい場合には、ターゲットのリソースに対応付けられた状態機械のみ反応するための仕掛けが必要です。
今回はリソースに対応した状態機械を定義してKaleidox上で動作させてみます。
モデル
今回のモデルは前回のモデルに対して以下の拡張を行っています。
- 状態機械purchaseの種別をresourceにする
具体的には以下の設定を入れます。
statemachine={ name="purchase" kind=resource ← この設定
この設定を行うことで、定義した状態機械はリソースに関連付けられます。
この設定を行った状態機械の定義は以下になります。
* event event=[{ name="confirm" },{ name="reject" },{ name="delivered" },{ name="cancel" },{ name="suspend" },{ name="resume" }] * statemachine statemachine={ name="purchase" kind=resource state=[{ name=INIT transition=[{ to=running }] },{ name=canceled transition=[{ to=FINAL }] },{ name=suspended transition=[{ guard=resume to=HISTORY }] }] statemachine=[{ name="running" state=[{ name=applying transition=[{ to=confirming }] },{ name=confirming transition=[{ guard=confirm to=confirmed },{ guard=reject to=rejected }] },{ name=confirmed transition=[{ to=delivering }] },{ name=rejected transition=[{ to=FINAL }] },{ name=delivering transition=[{ guard=delivered to=delivered }] },{ name=delivered transition=[{ to=FINAL }] }] transition=[{ guard=cancel to=canceled },{ guard=suspend to=suspended }] }] }
イベント
以下の6つのイベントを定義しています。
- confirm
- 確認OK
- reject
- 確認却下
- delivered
- 配送済み
- cancel
- キャンセル
- suspend
- 保留
- resume
- 再開
前回からの変更点はありません。
状態機械
定義したモデルの状態機械図は前回と同じ以下となります。
実行
それでは実行してみましょう。
最初にstatemachine-new関数で状態機械を作成します。第1引数には状態機械名を指定しますが、第2引数にリソースを特定するIDとして「12345」を指定しています。
kaleidox> setq sm (statemachine-new 'purchase "12345") StateMachine[purchase.running.confirming]
状態機械purchaseが作成され、confirming状態になりました。
ここでevent-issue関数でconfirmイベントを送出します。
前回までの状態機械はconfirmイベントに反応して状態がdeliveringに変わりましたが、今回の状態機械は無反応です。
kaleidox> event-issue 'confirm Event[confirm] kaleidox> sm StateMachine[purchase.running.confirming]
リソースに関連付けられた状態機械へのイベント送出にはevent-call関数を用います。第1引数にイベント名、第2引数にイベント送信先のリソースID「12340」を指定しました。
この場合は、先ほど作成した状態機械には変化がありません。
kaleidox> event-call 'confirm "12340" Event[confirm] kaleidox> sm StateMachine[purchase.running.confirming]
次に第1引数にイベント名、第2引数にイベント送信先のリソースID「12345」を指定しました。
リソースID「12345」は先程作成した状態機械に関連付けられたものです。
今回の場合は、状態機械の状態が無事confirmingからdeliveringに変わりました。
kaleidox> event-call 'confirm "12345" Event[confirm] kaleidox> sm StateMachine[purchase.running.delivering]
まとめ
今回はリソースに紐付いた状態機械を作成し、リソースIDを使って駆動する状態機械を選択を行ってみました。
次回はエンティティに状態機械に組み込む予定です。
諸元
- Kaleidox
- 0.3.1