Web Services Busを調べる: 第1回

UDDIベースの発見メカニズムによって、Webサービスの発見と公開がいとも簡単になる

IBM alphaWorksのWeb Services Toolkitバージョン3.2.2をダウンロードすると、Webサービス・プロセッサーを構築するためのフレームワークWeb Services Busが含まれています。2回からなるこの記事では、Busを利用してWebサービスをより手早く、より簡単に実動させる方法について著者Greg Flurryが紹介します。この第1回の記事では、BusのUDDIベースの発見メカニズムについて調べた後、Webサービスの公開プロセスを自動化するのに役立つ経験則的実例 (ベスト・プラクティス) について述べます。

Greg Flurry, Senior Technical Staff Member, IBM Software Group, Business Process Optimization

Greg FlurryGreg Flurryは、幅広いe-business環境のための最先端テクノロジーの調査を目的とするIBM Software Group Emerging Technologiesのメンバーです。連絡先はflurry@us.ibm.com です。


developerWorks
        プロフェッショナル著者レベル

2002年 11月

IBM alphaWorksのWeb Services Toolkitバージョン3.2.2に含まれるWeb Services Busは、Webサービス・プロセッサーを構築するためのフレームワークです。Busを利用して、Webサービスのクライアント、サーバー、ゲートウェイ、中間処理などを作成できます (参考文献を参照)。Busは他のWebサービス・フレームワークにはない高度な環境を提供し、Webサービスによる動的なeビジネスを可能にします。サービス要求者に対してはクライアント・サイドのon-ramp、サービス・プロバイダーに対してはサーバー・サイドのoff-ramp をサポートします。Web Services Invocation Framework (WSIF) の流れを引き継ぐBusのコアは、WSDLです。バスのoff-ramp (これをbusサービス という) で配置されるWebサービスはWSDLで記述することができ、off-rampはbusサービス用のWSDLを動的に作成できます。さらにBus off-rampには、busサービスに関する情報をUDDIレジストリで公開するオプション機能もあります。

加えて、Bus on-rampでは形式化され、交換可能な発見 および選択 メカニズムがサポートされます。簡単に言えば、BusはWSDL portTypeの特定の実装に対する要求を受け入れますが、発見メカニズムおよび選択メカニズムを起動して、要求をさまざまな実装に誘導します。交換可能な発見および選択メカニズムでは、あらゆる適切な方法を使って実装の検証をいくつか探し出した後、候補の中から適切な実装を1つ選び出すことができます。

WSTK 3.2.2の一部であるBusプロトタイプには、WSILに基づく発見メカニズムなど、Busのさまざまな機能を示すデモが盛り込まれています。この記事では、UDDIに基づく発見メカニズムを実装するためにBusのさまざまな機能を利用する方法について見ていきます。より詳細な情報については、Busプロトタイプ実装に付属の資料を参照してください。この連載記事を読むとき、図1 に示されているBusアーキテクチャーの概要を参考にできるでしょう。

図1. WebサービスのBusアーキテクチャー
WebサービスのBusアーキテクチャー

一般的なセットアップ方法

この記事のサンプル・コードを実行する前に、WSDKやWSTKに関連した機能を実行するための初期セットアップが必要です。まず、IBM developerWorksから入手可能なWeb Services Development Kitをインストールして構成します。このWSDKには、サンプルの実行に必要な専用UDDIレジストリの実装が含まれています。次に、IBM alphaWorksから入手可能なWeb Services Toolkitバージョン3.2.2をインストールして構成してください。このWSTKには、Web Services Busプロトタイプ実装が含まれています。この記事のサンプルでは、WSTKがWSDKの中にインストールされていることを想定しています。厳密にこのとおりでなくても構いませんが、WSDKによって提供される専用UDDIレジストリを使うようWSTKを構成する必要があります。WSTKおよびWSDKへのリンクは、最後の参考文献セクションにあります。

WSDKとWSTKのインストールが終わったら、インストールを確認するために、WSDK (またはご使用の任意のWebアプリケーション・サーバー) を開始して、いくつかの操作を行います。まず、UDDIレジストリのGUI (http://<hostname:port>/uddigui/) で、新しいブラウザー・インスタンスを指定する必要があります (ここで、<hostname:port> はUDDIレジストリがインストールされているマシンとポート)。デフォルト以外の値を使うようWSTKをまだ構成していなければ、デフォルト・ユーザー名 (demo) とデフォルト・パスワード (pwd) を必ず使用してログインしてください。すると、図2 のようなページが表示されます (サイズ変更またはスクロールする必要があるかもしれません)。

図2. UDDIレジストリGUI
UDDIレジストリGUI

次に、Busプロトタイプが機能することを確認します。コマンド・ウィンドウで、WSTK_HOME/services/demos/wsbus/client を開きます (WSTK_HOME はWSTK 3.2.2のインストール先ディレクトリ)。そのディレクトリで、1つまたは複数のデモを実行します。たとえば、Busのクライアント・サイドとサーバー・サイドの両方をテストするSimpleClientFilter.bat を実行するといいでしょう。デモが正常に実行されたら、次のセットアップ手順に進みます。


サンプルを準備する

この記事のサンプルを実行するのに必要なセットアップ作業は、少なくありません。サンプル・コードを実行する前に、以下の作業を行ってください。

  1. サービス実装を表すJavaBeansの作成。これには、サービス実装を記述するWSDLの作成も含まれます。
  2. 専用UDDIレジストリの事前準備。これには、サンプル用に作成されたさまざまなエンティティを所有する架空のビジネスを挿入することが含まれます。さらに、上記のサービス実装によって実装されたWSDL portTypeに対応するUDDI tModelを挿入します。
  3. BusでJavaBeansをbusサービスとして配置する。
  4. 配置されたbusサービスをテストする。

以下では、各ステップを1つずつ見ていきます。

サービスJavaBeansの作成

今回のサンプルでは、どこからでもアクセスできる株価情報サービスとして、3つの実装を使用します。リスト1 は、それらのうち1つのソースSQ1.java を示しています。

リスト1. 株価情報サービスSQ1.java
package gaf.uddi.sq;
public class SQ1 {
    public float getQuote(String symbol) {
        return (float) 155.25; }
}

なお、単純化のために、受信されるsymbolは無視されます。他のサービス実装SQ2.java およびSQ3.java もこれと同様ですが、異なる値を生成します。この3つのソースおよびクラス・ファイルが、この記事のコード・パッケージに含まれています。Beanのクラス・ファイルをWSTK Webアプリケーションで使用できるようにする必要があります。そうするには、Webアプリケーションのインストール先ディレクトリのwstk.ear/wstk.war/WEB-INF/classes/gaf/uddi/sq にこれらのファイルを入れてください。

Busでは、配置されたサービス実装を記述するためのオプションがいくつかあります。今回のサンプルでは、3つのサービスがすべて同じWSDL portTypeを実装することをBusが認識できるよう、「WSDLのみ」オプションを使用します。リスト2 は、JavaBeans SQ1、SQ2、およびSQ3によって実装されるportTypeのWSDLSQ.wsdl を示しています。

リスト2. サンプルによって実装されるportType用のWSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SQ" targetNamespace="http://sq.uddi.gaf/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:tns="http://sq.uddi.gaf/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <message name="getQuoteRequest">
        <part name="symbol" type="xsd:string"/>
    </message>
    <message name="getQuoteResponse">
        <part name="result" type="xsd:float"/>
    </message>
    <portType name="SQ">
        <operation name="getQuote" parameterOrder="symbol">
            <input message="tns:getQuoteRequest" name="getQuoteRequest"/>
            <output message="tns:getQuoteResponse" name="getQuoteResponse"/>
        </operation>
    </portType>
</definitions>

リスト3 には、SQ1実装のWSDLであるSQ1Java.wsdl が示されています。このWSDLはリスト2 のportTypeをインポートし、WSDLを使ってBusにJavaBeansを配置するのに必要とされるJavaバインディングを含んでいます。SQ2およびSQ3のWSDLコードも同様です。もちろん、バインディング、サービス、クラスの名前は異なります。

リスト3. SQ1実装用のWSDLであるSQ1Java.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="SQ1Java" targetNamespace="http://sq.uddi.gaf/"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:format="http://schemas.xmlsoap.org/wsdl/formatbinding/"
    xmlns:java="http://schemas.xmlsoap.org/wsdl/java/"
    xmlns:tns="http://sq.uddi.gaf/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <import location="SQ.wsdl" namespace="http://sq.uddi.gaf/"/>
    <binding name="SQ1JavaBinding" type="tns:SQ">
        <java:binding/>
        <format:typeMapping encoding="Java" style="Java">
            <format:typeMap formatType="java.lang.String" typeName="xsd:string"/>
            <format:typeMap formatType="float" typeName="xsd:float"/>
        </format:typeMapping>
        <operation name="getQuote">
            <java:operation methodName="getQuote"
                parameterOrder="symbol" returnPart="result"/>
            <input name="getQuoteRequest"/>
            <output name="getQuoteResponse"/>
        </operation>
    </binding>
    <service name="SQ1Service">
        <port binding="tns:SQ1JavaBinding" name="SQ1JavaPort">
            <java:address className="gaf.uddi.sq.SQ1"/>
        </port>
    </service>
</definitions>

このWSDLは、この記事のコード・パッケージに含まれています。4つのWSDLファイル (SQ.wsdlSQ1Java.wsdlSQ2Java.wsdlSQ3Java.wsdl) を、WSTK Webアプリケーションのインストール先のWEB-INF/wsbus/wsdl に入れる必要があります。

専用UDDIレジストリの事前準備

Bus off-rampではオプション機能として、WSDL Webサービスを公開するためのベスト・プラクティス (最良実例) に従って、配置済みサービスをUDDIレジストリに公開できます (この「ベスト・プラクティス」については、参考文献を参照してください)。後のステップでは、この機能を利用して、サービス配置時に自動的にサービスが公開されるようにします。なお、BusがUDDIレジストリに公開できるようにするには、公開されるサービスを所有することになるビジネス・エンティティをまず公開しなければなりません。そのために使用できるビジネスの名前と記述が、Bus off-rampのデフォルト構成に含まれています。読者がこのビジネスのデフォルト値を何らかの理由で変更した場合には、以下の手順でも適切に調整してください。

ビジネスを公開するには、UDDIレジストリGUIを使用できます。「Publish (公開)」タブをクリックし、「Advanced Publish (拡張公開)」の中の「Add a Business (ビジネスの追加)」をクリックします。ビジネス名には「Placeholder」、ビジネスの説明には「This holds services for WS Bus (WS Busのサービスを所有)」をそれぞれ指定します (デフォルトBus構成の場合)。その後、「Publish Business (ビジネスの公開)」をクリックすると、確認ページが表示されます。GUIの左画面をスクロールダウンして、「Show Owned Entities (所有されているエンティティを表示)」をクリックすると、図3 のように表示されます。ここでは、ユーザーdemo がサービス・タイプを1つも所有せず、サービスのない1つのビジネスを所有しています。

図3. UDDIレジストリGUIの「所有されているエンティティ」画面
UDDIレジストリGUIの「所有されているエンティティ」画面

すでに簡単に述べましたが、Busのオプション機能として、配置済みサービスをUDDIレジストリで公開する際に、tModelを使ってportTypeとバインディングを識別する経験則的実例 (ベスト・プラクティス) に従うことができます。今回のサンプルでもこのオプション機能を利用して、株価情報サービスportTypeの実装をレジストリで発見できるようにします。上記の株価情報サービス用のportType tModelを公開するには、バッチ・ファイルmakeTModel.bat をこの記事のコード・パッケージからWSTK_HOME/services/demos/wsbus/client にコピーしてください (WSTK_HOME はWSTK 3.2.2のインストール先ディレクトリ)。このバッチ・ファイルには株価情報portType WSDLを参照しているURLがハード・コーディングされています。実際のホスト名やポート番号が異なる場合には、ファイルを修正する必要があります。バッチ・ファイルを修正して適切なWSDL portType参照にしたら、これを実行します。正常に実行されたら、UDDIレジストリGUIを使って、所有されているエンティティをもう1度表示します。図4 のような情報が画面に表示されるでしょう。

図4. makeTModel.batの実行後、所有されているエンティティの画面を更新する
makeTModel.batの実行後、所有されているエンティティの画面を更新する

SQ portTypeに対応する、SQというtModelに注目してください。これ以外の2つのtModelは経験則的実例の実装ですが、ここでは詳しく説明する必要はないでしょう。

JavaBeansの配置

さて、株価情報portTypeを実装するJavaBeansをBusプロトタイプで配置できます。UDDIレジストリでの公開を自動化するには、レジストリ自体がBusで配置される必要があります。リスト4deployForUDDI.xml は、UDDIレジストリとサービス実装の配置に使われる配置ディスクリプタです。

リスト4. deployForUDDI.xml
<deploy force="true">
  <uddiInfos>
    <uddiInfo name="uddi1" userName="demo" password="pwd"  
       inquiryURL="http://localhost:80/uddisoap/inquiryapi" 
       publishURL="http://localhost:80/uddisoap/publishapi" />
  </uddiInfos>

  <busServices>
    <busService serviceName="SQ1" audited="false" started="true" 
       configuredPartRep="1" resolvedPartRep="1" authorized="false"  
       uddiTModelName="UNSPSC"  uddiKeyValue="84121801"  
       uddiKeyName="Stock market trading services"  
       portTypeNamespace="http://sq.uddi.gaf/" portTypeLocalName="SQ" >
      <channels>
        <channelReference channel="axis"/>
      </channels>
      <targetServices>
        <targetService serviceName="SQ1Service" started="true" locationType="1"
          location="http://localhost:80/wstk/wsbus/wsdl/SQ1Java.wsdl"
          serviceNamespace="http://sq.uddi.gaf/" />
      </targetServices>
      <uddiReferences>
        <uddiReference uddi="uddi1" />
      </uddiReferences>
    </busService>
    <busService serviceName="SQ2" ... >
      ... 
    </busService>
    <busService serviceName="SQ3" ... >
      ...
    </busService>
  </busServices>
</deploy>

リスト4 の最初の要素には、このサンプルで使われる専用UDDIレジストリに関する情報が含まれています。実際のホスト名とポート番号に応じて、レジストリ情報を編集する必要があるかもしれません。2番目の要素には、3つのサービス実装に関する情報が含まれています。リスト4 にはSQ1の実装だけが全体的に示されていますが、他の実装も (名前に関する情報を除いて) これと同様です。それぞれの<busService> には、busサービスの分類方法を示す属性が含まれます。この例の場合、(当然ですが) 株取引に関連したサービスであることがuddiTModelNameuddiKeyValue、およびuddiKeyName 属性によって示されています。さらに、それぞれの<busService> には、サービスによって実装されるportTypeを示す属性も含まれます。ここでは、portTypeNamespace およびportTypeLocalName 属性が上記のSQ portTypeに対応しています。UDDIレジストリの場合と同じく、サービスについて記述したWSDL文書の場所を示すホスト名とポート番号を修正して、実際のシステムの値を適切に反映させる必要があるかもしれません。

JavaBeansをbusサービスとして実際にBusに配置し、busサービスをUDDIレジストリで自動的に公開するには、配置ディスクリプタdeployForUDDI.xml をこの記事のコード・パッケージからWSTK_HOME/services/demos/wsbus/client/deployment にコピーした後、バッチ・ファイルdeployForUDDI.bat をコード・パッケージからWSTK_HOME/services/demos/wsbus/client にコピーします。このバッチ・ファイルを実行して、メッセージResults: OK が表示されたら、サービスの公開が正常に終了しました。

公開を確認するために、UDDIレジストリGUIを使って、所有されているエンティティを表示します。図5 は、サービスを表示させた結果を示しています。3つのサービスがすべて表示されるはずです。

図5. サンプル・ビジネスによって所有されるサービスを示す、登録済みビジネスの表示画面
サンプル・ビジネスによって所有されるサービスを示す、登録済みビジネスの表示画面

スクロールダウンすると、追加のtModelが表示されています。SQApacheAxisBinding というtModelはSOAP/HTTPバインディングに対応し、Busプロトタイプによって公開されたApache Axisチャネルを反映しています。追加のtModelは経験則的実例の実装ですが、無視して差し支えありません。

Busサービスのテスト

配置をさらにテストするために、SQClient.java 用のクラス・ファイルをこの記事のコード・パッケージからWSTK_HOME/services/demos/wsbus/client/examples にコピーします。その後、バッチ・ファイルrunSQ.bat をコード・パッケージからWSTK_HOME/services/demos/wsbus/client にコピーします。リスト5 は、SQClient.java のソースの断片です。

リスト5. SQClient.javaのソースの一部
package services.demos.wsbus.client.examples;
public class SQClient {
    static String serviceURL = null;
    public float getQuote(String symbol) throws Exception {
        System.out.println(
            "Discovering and selecting a Stock Quote Service instance.");
        QName qname = new QName("http://sq.uddi.gaf/", "SQ");
        System.setProperty(
            WSIFServiceFactory.WSIFFACTORY_CLASSNAME,
            "com.ibm.wsbus.wsif.WSIFBusServiceFactory");
        WSIFBusServiceFactory serviceFactory =
            (WSIFBusServiceFactory) WSIFServiceFactory.newInstance();
        WSIFService service = serviceFactory.getService(qname, serviceURL);
        WSIFPort port = service.getPort();
        WSIFOperation operation = port.createOperation("getQuote");
        WSIFMessage input = operation.createInputMessage();
        WSIFMessage output = operation.createOutputMessage();
        WSIFMessage fault = operation.createFaultMessage();
        System.out.println(
            "Invoking the selected Stock Quote Service instance.");
        input.setObjectPart("symbol", symbol);
        operation.executeRequestResponseOperation(input, output, fault);
        return output.getFloatPart("result");
    }
    public static void main(String[] args) throws Exception {
        if (args.length != 1) {
            usage();
            return;
        }
        serviceURL = args[0];           String symbol = "XXX";
        SQClient client = new SQClient();
        float result = client.getQuote(symbol);
        System.out.println(symbol + " = " + result);
    }
}

SQClientはWSIF風の手法を使ってWebサービスを起動します。まずサービス・ファクトリーを使って、サービスを記述しているWSDLからサービス表記を取得します。SQClientはシステム・プロパティを適切に設定することによって、Web Services Bus専用のサービス・ファクトリーを使用するよう強制します。サービス作成用の特定の修飾名 (ここでは名前空間とローカル名) がサービス・ファクトリーに与えられるため、Bus on-rampでのサービス作成時に、Busの発見および選択メカニズムが起動されます。

バッチ・ファイルrunSQ.bat によって、クライアントon-rampはWSTKとともにインストールされているデフォルトの発見および選択メカニズムを使用するようになります。これらのメカニズムは、与えられた情報を単に戻すだけです。つまり、Bus on-rampは標準的なWSIFの振る舞いをエミュレーションできます。runSQ を実際に実行すればわかるでしょう。実行するには、以下の構文を使用します。

runSQ.bat "http://localhost/wstk/wsbus/ServiceDefinition?name=SQ<n>"

ここで、<n> は起動したいサービスに応じて12、または3 になります。サービス用のURLがBus off-ramp機能を利用して、配置されるbusサービス用のWSDLを動的に生成することに注目してください。

runSQ.bat を実行すると、コマンド・ウィンドウにリスト6 のように表示されます。

リスト6. runSQ.batの実行結果
C:\wstk-3.2.2\services\demos\wsbus\client>runSQ.bat "http://localhost/wstk/wsbus
/ServiceDefinition?name=SQ2"
***
 Invocation of a Stock Quote Service -- default discovery and selection
***
Discovering and selecting a Stock Quote Service instance.
using WSIFServiceFactory
Sample Discovery: giving you what you gave me!
Sample Selection: giving you what you gave me!
Invoking the selected Stock Quote Service instance.
XXX = 255.25

サンプルの発見および選択メカニズムの結果を見ると、実際には何も行われないことがわかります。他のbusサービスに関してrunSQ.bat を実行しても、結果は同様です。


UDDIベースの発見

基本的な部分がすべてセットアップされたので、いよいよUDDIベースの発見機能を試す段階になりました。最後のステップとして、UDDIレジストリを使用するカスタマイズされた発見実装が必要です。リスト7 は、UDDIに基づく発見実装の断片です。

リスト7. UDDIに基づく発見実装の一部
package services.demos.wsbus.client.selection;
public class UDDIDiscovery implements BusDiscovery {
    private PortTypeFinderUDDI finder = null;
    public UDDIDiscovery() {
        System.setProperty(
            org.uddi4j.transport.TransportFactory.PROPERTY_NAME,
            WSTKConstants.TRANSPORT_CLASS);
        finder = new PortTypeFinderUDDI();
        finder.setInquiryURL(WSTKConstants.UDDI_INQUIRY_URL);
    }
    public final Object[] discovery(QName portTypeQName, String wsdlReference)
        throws WSBusException {
        System.out.println("UDDI Discovery: finding services in UDDI!");
        return find(portTypeQName);
    }
    public final Object[] discovery(
        QName portTypeQName,
        Definition wsdlDefinition)
        throws WSBusException {
        System.out.println("UDDI Discovery: finding services in UDDI!");
        return find(portTypeQName);
    }
    private String[] find(QName portTypeQName) throws WSBusException {
        String[] wsdlURL = null;
        Vector wsdl = new Vector();
        try {
            BindingDetail bd =
                finder.findImplementations(
                    portTypeQName.getNamespaceURI(),
                    portTypeQName.getLocalPart());
            Vector btv = bd.getBindingTemplateVector();
            for (int k = 0; k < btv.size(); k++) {
                BindingTemplate bt = (BindingTemplate) btv.elementAt(k);
                TModelInstanceDetails tmid = bt.getTModelInstanceDetails();
                Vector tmidv = tmid.getTModelInstanceInfoVector();
                for (int j = 0; j < tmidv.size(); j++) {
                    TModelInstanceInfo tmii =
                        (TModelInstanceInfo) tmidv.elementAt(j);
                    InstanceDetails id = tmii.getInstanceDetails();
                    if (id != null) {
                        OverviewDoc od = id.getOverviewDoc();
                        String oURL = od.getOverviewURLString();
                        // must remove port information
                        int p = oURL.indexOf('#');
                        wsdl.add(oURL.substring(0, p));
                        System.out.println(
                            "\tservice URL: " + oURL.substring(0, p));
                    }
                }
            }
            wsdlURL = new String[wsdl.size()];
            for (int k = 0; k < wsdl.size(); k++) {
                wsdlURL[k] = (String) wsdl.elementAt(k);
            } } catch (Exception ex) {
            throw new WSBusException(ex.getMessage());
        }
        return wsdlURL;
    }
}

この発見実装は、BusPortTypeFinderUDDI のインスタンスを作成します。サービスを効率的に見つけるために、このクラスのfindImplementations() メソッドは、busサービスをUDDIレジストリで公開するための経験則的実例を利用しています。基本的に、このメソッドは適切なWSDL portTypeを実装するUDDIbindingTemplates を探すだけです。ここでは、Busに配置された株価情報サービスのportTypeを探します。Busにおける経験則的実例の実装によって、サービス実装WSDLのURLがbindingTemplate 内のtModelInstanceInfooverviewURL に格納されます。発見実装はこれらのURLを累積して返し、それが選択メカニズムで使われます。

Bus on-rampがUDDIベースの発見実装を使用するためには、構成ファイルを使ってサンプル実装をオーバーライドしなければなりません。リスト8 は、このサンプル用の構成ファイルwsbusClientUDS.cfg です。

リスト8. wsbusClientUDS.cfg
<busInfo namespaceURI=" started="true" 
    discoveryClass="services.demos.wsbus.client.selection.UDDIDiscovery" 
    selectionClass="services.demos.wsbus.client.selection.RandomSelection">
</busInfo>

この構成ファイルは上記のUDDIベースの実装をBus発見メカニズムとして確立し、WSTKとともにインストールされているランダム選択実装をBus選択メカニズムとして確立します。後者は、与えられた候補の中から無作為に選択します。

UDDIベースの実装をテストするには、UDDIDiscovery.java のクラス・ファイルをこの記事のコード・パッケージからWSTK_HOME/services/demos/wsbus/client/selection にコピーした後、構成ファイルwsbusClientUDS.cfg とバッチ・ファイルuddiDiscoSQ.bat をコード・パッケージからWSTK_HOME/services/demos/wsbus/client にコピーします。最後に、uddiDiscoSQ.bat を実行します。出力はリスト9 のようになるでしょう。

リスト9. UDDIベースの実装のテスト結果
C:\wstk-3.2.2\services\demos\wsbus\client>uddiDiscoSQ.bat
***
 Invocation of a Stock Quote Service, UDDI discovery and random selection
***
Discovering and selecting a Stock Quote Service instance.
using WSIFServiceFactory
UDDI Discovery: finding services in UDDI!
FindTModel findPortTypeTModelKey() results: <?xml version="1.0" encoding="UTF-8"
?>
<tModelList generic="2.0" operator="operator" truncated="false" xmlns="urn:uddi-
org:api_v2">
    <tModelInfos>
        <tModelInfo tModelKey="UUID:389C138B-27FD-4E70-9AFD-0A3319622EC2">
            <name>SQ</name>
        </tModelInfo>
    </tModelInfos>
</tModelList>
        service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ3
        service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ2
        service URL: http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ1
Selecting #1
Retrieving document at 'http://FLURRY:80/wstk/wsbus/ServiceDefinition?name=SQ2'.
Retrieving import document at 'http://FLURRY:80/wstk/wsbus/ServiceInterface?name
=SQ2
Invoking the selected Stock Quote Service instance.
XXX = 255.25

リスト9 の中で、以下の点に注意してください。

  • Bus on-rampがUDDI発見実装を使用すること
  • portType tModelがUDDIレジストリに存在することの確認
  • portTypeの実装をUDDIレジストリ内で検索した結果。つまり、株価情報portTypeを実装する3つのbusサービスのWSDL URL。
  • ランダム選択メカニズムによって選び出された候補
  • 選択されたサービスを起動した結果。選択されたサービスに応じて、結果は異なります。

WSTKを復元する

この記事のサンプルを実行する前の状態にBus構成を戻したい場合があるかもしれません。つまり、busサービスのアンデプロイ (配置削除) です。さらに、このサンプルで使われたUDDIレジストリの状態を復元したい場合もあるでしょう。つまり、さまざまなtModel、サービス、その他の作成済み実装を削除するということです。残念ながらBus off-rampのバグのために、サービスをUDDIレジストリから自動的に公開削除することはできません。Bus内の株価情報サービスをアンデプロイする前に、手動でサービスをUDDIレジストリから削除する必要があります (そうするには、UDDIレジストリGUIを使用できます)。サービスを公開削除するためにBusを使用すると、通常はBusが (場合によってはUDDIレジストリが) 停止します。

UDDIレジストリからサービスを削除した後、ファイルundeployForUDDI.xml をこの記事のコード・パッケージからWSTK_HOME/services/demos/wsbus/client/deployment にコピーして、バッチ・ファイルundeployForUDDI.bat をコード・パッケージからWSTK_HOME/services/demos/wsbus/client にコピーします。次にundeployForUDDI.bat を実行します。これにより、3つの株価情報サービスとUDDIレジストリがBus off-ramp構成からアンデプロイされます。その後、ご希望に応じて、サンプル実行のためにUDDIレジストリで公開したtModelとビジネスを手動で削除することもできます。


結論

この記事では、WSDL、UDDI、およびBus発見に関連したWeb Services Busのさまざまな面について見てきました。とくに、UDDIレジストリに基づく発見メカニズムを作成する方法や、特定のportTypeを実装したサービスを見つけるために、Busに実装されている経験則的実例を利用してUDDIレジストリを効率的に検索する方法について学習しました。もっと洗練された発見メカニズムであれば、他のUDDIレジストリ、WSILレジストリ、データベース、その他のportType実装の候補となるソースを検索できるでしょう。同様に、サンプル・コードではサービスが無作為に選択されますが、もっと洗練された選択メカニズムであれば、インテリジェントな選択を行うことができるでしょう。たとえば、もし情報が得られるなら、費用やサービス・レベル条項に基づくことができます。

最後に一言。この記事のサンプルの発見実装はクライアントon-rampで実行されましたが、同様の手法をBusのサーバー on-rampでも使用できます。(サーバーon-rampについては、WSTKに付属のBus資料をお読みください。)これによって、(やはりalphaWorksから入手可能な) Web Services Gatewayと同様に、中間処理として機能するようBusサーバー・サイドを構成できるでしょう(参考文献を参照)。

この記事では、Web Services Busのユニークな機能を利用して、WSDL portType実装を検索および起動するためのUDDIベースのメカニズムをどのように構築できるかについて説明しました。今後の記事では、Web Services Busのもう1つの機能であるバス・フィルター についてご紹介します。これは、Webサービス・フレームワークとしてのBusの機能を拡張します。

参考文献

  • この記事のサンプルのソース、WSDLファイル、バッチ・ファイルなどが、コード・パッケージ (ZIP) に含まれています。コードはWSTK環境で稼働するよう書かれていて、他のWSTKデモと同じような構造になっています。
  • Web Services Toolkitバージョン3.2.2 は、Web Services Busを含む数多くのWebサービス・テクノロジーを提供します。
  • IBM WebSphere SDK for Web Services は、Webサービス・プロバイダーの環境を提供します。
  • Web Services Gateway を使用すれば、企業ファイアウォールの内側および外側に存在するアプリケーションやプロセスからWebサービスにアクセスできるようになります。
  • UDDIのベスト・プラクティスについて、『Using WSDL in a UDDI registry: UDDI best practice』(Francisco Curbera、David Ehnebuske、Dan Rogers著、May 2002, UDDI.org、PDF版) をお読みください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=242126
ArticleTitle=Web Services Busを調べる: 第1回
publish-date=112002