|
今回は,SCAのプログラミング・モデル解説の後編として,サンプル・プログラム「Abcサービス」を参照しながら,SCAプログラムの作り方を順を追って解説します。
最初に行うことはJavaインタフェース定義です。
Javaインタフェース定義 - ローカルの場合
前回の終わりに,Referenceの宛先をWebサービスに変更しました。その結果,現在のAbcサービスは以下のようになっています(図1)。例によってこれは,SCAのXML文書をわかりやすく図にしたものです。
| |
図1●Abcサービス全体像 [画像のクリックで拡大表示] |
このプログラムの動作は,「値段(price)と割引率(discountRate)を引数として与えると販売価格を戻す」というものです。非常に単純な動きですが,しっかりとSCAしています。
priceは呼び出し時の引数として,discountRateはPropertyのXML定義によって渡されます。販売価格を計算しているのは,Webサービスで呼び出しているPriceServiceになります。
Abcサービス自身のコードから見ていきましょう。まずは,インタフェース「AbcService」です(リスト1)。
|
リスト1●インタフェース「AbcService」 |
普通のJavaのインタフェースですが,これがSCAにおけるインタフェースになります。これを実装した以下のコード(リスト2(1))で,@Serviceの定義がされています。リスト1のインタフェース「AbcService」をローカルで使用可能なことを示しています。SCAを使用してAbcServiceを呼び出すと,getDiscountPriceをコールできることになります。
リスト2●「AbcService」の実装コード |
Javaインタフェース定義 - リモートの場合
Abcサービス自身は,ローカルにJavaで呼び出されるものですが,割引率の計算をしているPriceServiceは,Webサービスで呼び出されています。PriceServiceのインタフェースはリスト3になります。
リスト3●インタフェース「PriceService」 |
リスト3(1)の@Remotableというアノテーションが,このJavaインタフェースのリモートからの参照を可能にしています。通常は,リモートへの公開は,Webサービスのバインディングを使用して行われます。これに対応したWebサービスの定義であるWSDLは,リスト4のようになります。
| |
リスト4●PriceServiceのWSDL [画像のクリックで拡大表示] |
リスト4(1)のport定義のあたりを見ていただくと,先の@Remoteとの関係がおわかりいただけると思います。WSDLの形式としては,Document/Literal型(wrapped)で標準的なものです。このWSDLが,リモートからPriceServiceを参照するときのインタフェース定義となります。ちなみに現在のSCA 1.0では,インタフェースの定義にJava Interface(interface.java)とWSDL(interface.wsdl)が使用可能になっています。
リモートに公開されるサービスであっても,PriceService実装のコード(リスト5)は,以下の通りで通常のPOJOです。
|
リスト5●PriceServiceの実装コード |