澤出 達郎(さわいで たつろう)
日本アイ・ビー・エム ソフトウェア事業 ICP コンサルティング I/Tスペシャリスト

 今回は,SCAのプログラミング・モデル解説の後編として,サンプル・プログラム「Abcサービス」を参照しながら,SCAプログラムの作り方を順を追って解説します。

 最初に行うことはJavaインタフェース定義です。

Javaインタフェース定義 - ローカルの場合

 前回の終わりに,Referenceの宛先をWebサービスに変更しました。その結果,現在のAbcサービスは以下のようになっています(図1)。例によってこれは,SCAのXML文書をわかりやすく図にしたものです。

図1●Abcサービス全体像
図1●Abcサービス全体像
[画像のクリックで拡大表示]

 このプログラムの動作は,「値段(price)と割引率(discountRate)を引数として与えると販売価格を戻す」というものです。非常に単純な動きですが,しっかりとSCAしています。

 priceは呼び出し時の引数として,discountRateはPropertyのXML定義によって渡されます。販売価格を計算しているのは,Webサービスで呼び出しているPriceServiceになります。

 Abcサービス自身のコードから見ていきましょう。まずは,インタフェース「AbcService」です(リスト1)。


 package abc;

 public interface AbcService {

     int getDiscountPrice(int price);

 }
リスト1●インタフェース「AbcService」

 普通のJavaのインタフェースですが,これがSCAにおけるインタフェースになります。これを実装した以下のコード(リスト2(1))で,@Serviceの定義がされています。リスト1のインタフェース「AbcService」をローカルで使用可能なことを示しています。SCAを使用してAbcServiceを呼び出すと,getDiscountPriceをコールできることになります。

リスト2●「AbcService」の実装コード
リスト2●「AbcService」の実装コード

Javaインタフェース定義 - リモートの場合

 Abcサービス自身は,ローカルにJavaで呼び出されるものですが,割引率の計算をしているPriceServiceは,Webサービスで呼び出されています。PriceServiceのインタフェースはリスト3になります。

リスト3●インタフェース「PriceService」
リスト3●インタフェース「PriceService」

 リスト3(1)の@Remotableというアノテーションが,このJavaインタフェースのリモートからの参照を可能にしています。通常は,リモートへの公開は,Webサービスのバインディングを使用して行われます。これに対応したWebサービスの定義であるWSDLは,リスト4のようになります。

リスト4●PriceServiceのWSDL
リスト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です。


 package abc;

 public class PriceServiceImpl implements PriceService {

     public int getDiscountPrice(int price, float rate) {
         System.out.println("Price="+price+"Rate="+rate);
         return (int)(price * rate);
     }

 }
リスト5●PriceServiceの実装コード