合成手順は以下のようになります.
#ref(): File not found: "purchaseordercol.png" at page "Synthesis(Eng)"
コレオグラフィを右図に示します. 右図はUML1.xのコラボレーション図の記法により書かれています. *1
この例は,BPEL-WS 2.0仕様書を元に T. Bultan等によって作成された例を一部改変しています.
この例では,Customer, Vendor, Shipping, Invoicing, Scheduling の5つのサービスが存在します.VendorはCustomerからorderを受け取ると,Shipping, Invoicing, Schedulingの各サービスに指令を出し,それらからの返答をまとめてCustomerにorderReplyとして返信します.
Shippingへの指令はshipReqで,返答はshipInfoです.
Invoicingへの指令はproductInfoとshipTypeで,返答はinvoiceです.ここで,productInfoはorderを受けるとすぐに送信しますが,shipTypeはshipTypeはshipReqを送信した後でないと送信してはいけません.InvoicingはproductInfoとshipTypeを受信した後に,何らかの処理を行い,invoiceを返信します.
Schedulingへの指令はproductScheduleとshipScheduleです.ここで,VendorはproductScheduleについてはorderを受けるとすぐに送信しますが,shipScheduleはshipInfoを受信した後に送信します.
VendorはshipInfoとinvoiceを受信して,shipScheduleを送信した後にorderReplyをCustomerに送信します.
RSA上に,UMLプロジェクトを作成します.
次に,クラス図を作成します.この例では,Customer, Vendor, Shipping, Invoicing, Schedulingのサービスが存在しますので,それらのクラスを作成します.
#ref(): File not found: "classDiagram.png" at page "Synthesis(Eng)"
コミュニケーション図を作成し,作成したクラスをコミュニケーション図上にライフラインとして配置します.
通信が行われるライフライン間にメッセージ路を引きます.
#ref(): File not found: "communicationDiagram1.png" at page "Synthesis(Eng)"
メッセージを追加します.
RSAではメッセージの種類として,
の三種類を選ぶことができます.CSCB Toolsでは,非同期呼び出しと同期呼び出しの2種類をサポートしています. ここでは,例の全てのメッセージが非同期呼び出しであるとします. メッセージを追加したコミュニケーション図は下図のようになります.
#ref(): File not found: "communicationDiagram2.png" at page "Synthesis(Eng)"
メッセージ間の順序関係を定義します.
CSCB Toolsではメッセージの「文書」に先行するメッセージを記述することにします. 例えば,orderReplyにはshipInfo, invoice, shipScheduleが先行するので,orderReplyの文書に下図のような記述を追加します.
#ref(): File not found: "communicationDiagram3.png" at page "Synthesis(Eng)"
これで,準備完了です.
プロジェクトエクスプローラーで状態機械を合成するパッケージを右クリックし,メニューから「Create StateMachine?」-> 「create State Machine all by CSCB」を選択すると,全てのサービスの状態機械が合成されいます.
ちなみに,「create State Machine by CSCB」を選択すると,合成するサービスを選択することができます. また,「... by projection」を選択すると射影法によって状態機械を合成します.
#ref(): File not found: "stateMachine1.png" at page "Synthesis(Eng)"
特に問題が無ければ,状態機械が合成され,モデルに追加されます. ちょっとわかりづらいですが,上の図のPurchaseOrder?プロジェクトのBlanc Packageにはクラス図とコミュニケーション図しかありませんが,下図では各サービスの状態機械が追加されています.
#ref(): File not found: "stateMachine2.png" at page "Synthesis(Eng)"
以下に,合成された状態機械を示します.
初期疑似状態から状態V1への遷移において,操作"send order to vendor"(vendorにメッセージorderを送信する)を実行し,事象orderReply_receiveの生起により終了状態に遷移しています.
#ref(): File not found: "stateMachine_customer.png" at page "Synthesis(Eng)"
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(): File not found: "stateMachine_vendor.png" at page "Synthesis(Eng)"
ShippingはshipReqを受信すると,shipInfoをvendorに返信します.
#ref(): File not found: "stateMachine_shipping.png" at page "Synthesis(Eng)"
InvoicingはshipTypeとproductInfoを並行して受信します.そして,shipTypeを受信するとvendorにinvoiceを送信します. *2
#ref(): File not found: "stateMachine_invoicing.png" at page "Synthesis(Eng)"
SchedulingはshipScheduleとproductScheduleを受信します.
#ref(): File not found: "stateMachine_scheduling.png" at page "Synthesis(Eng)"
実行後のクラス図は下図のようになります.
通信先への参照と,呼び出されるメソッドが追加されています.
#ref(): File not found: "classDiagram2.png" at page "Synthesis(Eng)"