RIGHT:[[English>Synthesis(Eng)]]

** コミュニケーション図から状態機械の合成 [#qbf41a3f]
合成手順は以下のようになります.
+ クラス図の作成
+ コミュニケーション図の作成
+ 状態機械の合成

*** 例題 [#e873c495]
#ref(purchaseordercol.png,right,around)


コレオグラフィを右図に示します.
右図はUML1.xのコラボレーション図の記法により書かれています.
((コラボレーション図はUML2.xではコミュニケーション図と名前が変わっています.コラボレーション図では先行子を使ってメッセージ間の順序関係を記述できます.例では,例えば shipReqの前にある 1/A1 が先行子です.A1はshipReqを表し,メッセージ1がA1に先行することを表しています.すなわち,Vendorはorderを受信後shipReqを送信しなければなりません.))

この例は,[[BPEL-WS 2.0>http://docs.oasis-open.org/wsbpel/2.0/wsbpel-specification-draft.html]]仕様書を元に [[T. Bultan等によって作成された例>http://dx.doi.org/10.1007/s11761-008-0022-7]]を一部改変しています.


この例では,Customer, Vendor, Shipping, Invoicing, Scheduling の5つのサービスが存在します.VendorはCustomerからorderを受け取ると,Shipping, Invoicing, Schedulingの各サービスに指令を出し,それらからの返答をまとめてCustomerにorderReplyとして返信します.

Shippingへの指令はshipReqで,返答はshipInfoです.

Invoicingへの指令はproductInfoとshipTypeで,返答はinvoiceです.Vendorは,productInfoについてはorderを受けるとすぐに送信しますが,shipTypeについてはshipInfoを送信した後でないと送信してはいけません.InvoicingはproductInfoとshipTypeを受信した後に,何らかの処理を行い,invoiceを返信します.



Schedulingへの指令はproductScheduleとshipScheduleです.ここで,VendorはproductScheduleについてはorderを受けるとすぐに送信しますが,shipScheduleはshipInfoを受信した後に送信します.

VendorはshipInfoとinvoiceを受信して,shipScheduleを送信した後にorderReplyをCustomerに送信します.

*** クラス図の作成 [#pe69aaa6]

RSA上に,UMLプロジェクトを作成します.

次に,クラス図を作成します.この例では,Customer, Vendor, Shipping, Invoicing, Schedulingのサービスが存在しますので,それらのクラスを作成します.

#ref(classDiagram.png,center)

*** コミュニケーション図の作成 [#t120ba7a]

コミュニケーション図を作成し,作成したクラスをコミュニケーション図上にライフラインとして配置します.

通信が行われるライフライン間にメッセージ路を引きます.

#ref(communicationDiagram1.png,center)

メッセージを追加します.

RSAではメッセージの種類として,
- 非同期呼び出し(Asynchronous Call)
- 非同期シグナル(Asynchronous Signal)
- 同期呼び出し(Synchronous Call)

の三種類を選ぶことができます.CSCB Toolsでは,非同期呼び出しと同期呼び出しの2種類をサポートしています.
ここでは,例の全てのメッセージが非同期呼び出しであるとします.
メッセージを追加したコミュニケーション図は下図のようになります.

#ref(communicationDiagram2.png,center)

メッセージ間の順序関係を定義します.

- コミュニケーション図ではコラボレーション図にあった先行子が無くなっています.
- シーケンス番号がありますが,例のような順序を表すことはできません.

CSCB Toolsではメッセージの「文書」に先行するメッセージを記述することにします.
例えば,orderReplyにはshipInfo, invoice, shipScheduleが先行するので,orderReplyの文書に下図のような記述を追加します.

#ref(communicationDiagram3.png,center)

これで,準備完了です.

*** 状態機械の合成 [#r100e3cd]

プロジェクトエクスプローラーで状態機械を合成するパッケージを右クリックし,メニューから「Create StateMachine」-> 「create State Machine all by CSCB」を選択すると,全てのサービスの状態機械が合成されいます.

ちなみに,「create State Machine by CSCB」を選択すると,合成するサービスを選択することができます.
また,「... by projection」を選択すると射影法によって状態機械を合成します.

#ref(stateMachine1.png,center)

特に問題が無ければ,状態機械が合成され,モデルに追加されます.
ちょっとわかりづらいですが,上の図のPurchaseOrderプロジェクトのBlanc Packageにはクラス図とコミュニケーション図しかありませんが,下図では各サービスの状態機械が追加されています.
ちょっとわかりづらいですが,上の図のPurchaseOrderプロジェクトのBlank Packageにはクラス図とコミュニケーション図しかありませんが,下図では各サービスの状態機械が追加されています.

#ref(stateMachine2.png,center)


*** 実行結果 [#tba5403c]

以下に,合成された状態機械を示します.

- Customerの状態機械

初期疑似状態から状態V1への遷移において,操作"send order to vendor"(vendorにメッセージorderを送信する)を実行し,事象orderReply_receiveの生起により終了状態に遷移しています.

#ref(stateMachine_customer.png,center)

- Vendorの状態機械

Vendorはメッセージorderの受信事象order_receiveが生起すると,3つのプロセスを並行して実行します.これらは状態V2の3つの領域にある状態機械で表現されます.

最初の領域では,shippingにshipReqを送信し,shipInfoを受信すると,さらに2つのプロセスに分かれます.一つ目のプロセスではschedulingにshipScheduleを送信します.もう一つのプロセスではinvoicingにshipTypeを送信し,invoiceを受信します.これら2つのプロセスが終了するとcustomerにorderReplyを送信します.

2つめの領域では,schedulingにproductScheduleを送信します.

3つめの領域では,invoicingにproductInfoを送信します.

3つの領域の実行が終了すると,終了状態に遷移します.
#ref(stateMachine_vendor.png,center)

- Shippingの状態機械

ShippingはshipReqを受信すると,shipInfoをvendorに返信します.

#ref(stateMachine_shipping.png,center)

- Invocingの状態機械
- Invoicingの状態機械

InvoicingはshipTypeとproductInfoを並行して受信します.そして,shipTypeを受信するとvendorにinvoiceを送信します.
((この例では,invoiceにproductInfoが先行していないので,InvocingはproductInfoを受信する前にinvoiceを発行する可能性があります.この問題は,コレオグラフィにおいてinvoiceにproductInfoが先行するようにすれば解決します.))
((この例では,invoiceにproductInfoが先行していないので,InvoicingはproductInfoを受信する前にinvoiceを発行する可能性があります.この問題は,コレオグラフィにおいてinvoiceにproductInfoが先行するようにすれば解決します.))

#ref(stateMachine_invoicing.png,center)

- Schedulingの状態機械

SchedulingはshipScheduleとproductScheduleを受信します.

#ref(stateMachine_scheduling.png,center)

- クラス図

実行後のクラス図は下図のようになります.

通信先への参照と,呼び出されるメソッドが追加されています.

#ref(classDiagram2.png,center)

RIGHT:[[CSCB]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS