Web Services Addressing を使用する JAX-RPC Web サービス・アプリケーションの作成

Web サービス・アドレッシング (WS-Addressing) は、Web サービスをアドレス指定してメッセージ内でアドレッシング情報を提供するための標準の方法を定義することで、Web サービス間のインターオペラビリティーを補助します。このタスクでは、WS-Addressing エンドポイント参照を使用してアクセスされる JAX-RPC Web サービスの作成に必要なステップについて説明します。このタスクはまた、Web サービスの一部としてステートフル・リソースを使用するために必要な追加のステップも説明しています。

始める前に

このタスクで説明されているステップは、WebSphere® Application Server 上で実行されるサーバーおよびクライアントに適用されます。

このタスクについて

このタスクは、WS-Addressing 仕様を使用する Web サービスを作成する場合に実行します。

手順

  1. エンドポイント参照をターゲット・サービスに戻す Web サービスの Web サービス記述言語 (WSDL) 文書を作成または生成することによって、Web サービス・インターフェースを提供します。 インターフェースは、ファクトリー・オペレーションまたは別々のファクトリー・サービスを使用することによって可能になるエンドポイント参照の戻しを行う必要があります。 ターゲット・サービスはリソース・インスタンス (例えばショッピング・カート) に面することができます。
  2. 前のステップで作成した Web サービスを実装します。実装の WS-Addressing 部分に対して、以下のステップを実行します。
    1. IBM 所有 Web サービス・アドレッシング API を使用したエンドポイント参照の作成の以下の指示に従って、Web サービスを参照するエンドポイント参照を作成します。
    2. オプション: ご使用のインターフェースが、リソース・インスタンスを渡す Web サービスを呼び出す場合、リソース・インスタンスを作成または検索します。
    3. オプション: リソース・インスタンスを使用している場合は、リソースの ID を入手し、EndpointReference.setReferenceParameter(QName resource_id_name, String value) メソッドを使用して、それを参照パラメーターとしてエンドポイント参照と関連付けます。 リソース ID はアプリケーション依存であり、リソース・インスタンスの作成時に生成されることがあります。
      重要: リソース ID は SOAP メッセージに含めて伝搬されるため、リソース ID 内に機密情報を書き込んではなりません。
      ここで、エンドポイント参照が、リソースをターゲットにします。
    4. エンドポイント参照を戻します。
  3. Web サービスがリソース・インスタンスを使用している場合は、実装を拡張して、着信メッセージが適切なリソース・インスタンスと一致するようにします。 リソース ID を前に作成したエンドポイント参照と関連付けたので、そのエンドポイント参照でターゲットされた着信メッセージはどれも、メッセージの SOAP ヘッダー内の参照パラメーターとしてリソース ID 情報を含んでいます。 リソース ID は SOAP ヘッダーで受け渡されるため、それを Web サービス・インターフェース上で公開する必要はありません。WebSphere Application Server は、メッセージを受信すると、この情報をスレッドのメッセージ・コンテキスト内に書き込みます。 実装を拡張して、以下のアクションを実行します。
    1. EndpointReferenceManager.getReferenceParameterFromMessageContext(QName resource_id_name) メソッドを使用して、メッセージ・コンテキストからリソース・インスタンス ID を入手します。
    2. メッセージを適切なリソース・インスタンスに転送します。
  4. クライアントを構成してサービスと通信するには、メッセージをエンドポイントに送信するファースト・ステップ内で、サービスによって作成されたエンドポイント参照を使用します。
    1. Stub オブジェクトを (Java™ Naming and Directory Interface (JNDI) でサービスを検索して) 取得するか、または空の Call オブジェクトを作成します。
    2. エンドポイント参照をプロキシー・オブジェクトと関連付けます。 Stub オブジェクトまたは Call オブジェクトの setProperty(String property_name, Object value) メソッドを使用します。プロパティー名として WS-Addressing 定数 WSADDRESSING_DESTINATION_EPR を、値としてエンドポイント参照を使用します。
      このプロシージャーは、自動的に Stub オブジェクトまたは Call オブジェクトを構成して、エンドポイント参照の Web サービス (またはご使用のインターフェースがリソース・インスタンスに面する Web サービスを使用している場合は、リソース・インスタンス) を表します。Call オブジェクトの場合、このプロセスには、 エンドポイント参照と関連付けられたインターフェースおよびエンドポイント・メタデータ (portType エレメントおよび port エレメント) が含まれます。
      注: Stub オブジェクトが別のインターフェースを表すように構成されている場合など、エンドポイント参照のメタデータがアウトバウンド・メッセージに既に関連付けられている情報と矛盾する場合は、そのエンドポイントの呼び出しの試行で例外 javax.xml.rpc.JAXRPCException がスローされます。

    Stub または Call オブジェクト上の呼び出しは、エンドポイント参照で定義されて、Web サービスまたはリソース・インスタンスでターゲットされます。呼び出しが発生すると、この製品は、ターゲット・リソースを識別するエンドポイント参照内に含まれている参照パラメーターなどの、適切なメッセージ・アドレッシング・プロパティーをメッセージ・ヘッダーに追加します。

タスクの結果

Web サービスおよびクライアントは、WS-Addressing サポートを介してエンドポイント参照を使用するように構成されます。

エンドポイント参照をターゲット・サービスに戻す Web サービス・インターフェースの提供

以下の例は、この手順のステップ 1 から 4 に対応しています。 これらの例では、IT 組織が Web サービスを使用してプリンターのネットワークを管理する方法を示しています。 この組織では、各プリンターを、 エンドポイント参照によって指定するリソースとしています。 以下の例は、WebSphere Application Server および JAX-WS が提供する、IBM 専有の Web Services Addressing (WS-Addressing) アプリケーション・プログラミング・インターフェース (API) を使用したサービスのコード化の方法を示しています。

この IT 組織では、CreatePrinter portType エレメントを提供する PrinterFactory サービスを実装します。 この portType エレメントは、CreatePrinterRequest メッセージを受け入れ、論理プリンターを示すリソースを作成し、 そのリソースへの参照となるエンドポイント参照をつけて応答します。

このような PrinterFactory サービスの WSDL 定義には、以下のコードが含まれています。
<wsdl:definitions targetNamespace="http://example.org/printer" ...
                  xmlns:pr="http://example.org/printer">
  <wsdl:types>
    ...
    <xsd:schema...>
      <xsd:element name="CreatePrinterRequest"/>
      <xsd:element name="CreatePrinterResponse" 
                   type="wsa:EndpointReferenceType"/>
    </xsd:schema>   </wsdl:types>
  <wsdl:message name="CreatePrinterRequest">
    <wsdl:part name="CreatePrinterRequest" 
               element="pr:CreatePrinterRequest" />
  </wsdl:message>
  <wsdl:message name="CreatePrinterResponse">
    <wsdl:part name="CreatePrinterResponse" 
               element="pr:CreatePrinterResponse" />
  </wsdl:message>
  <wsdl:portType name="CreatePrinter">
    <wsdl:operation name="createPrinter">
      <wsdl:input name="CreatePrinterRequest" 
                  message="pr:CreatePrinterRequest" />
      <wsdl:output name="CreatePrinterResponse"
                  message="pr:CreatePrinterResponse" />
    </wsdl:operation>
  </wsdl:portType>
</wsdl:definitions>

上記の例の CreatePrinter オペレーションは、 新規に作成されたプリンター・リソースを 示す wsa:EndpointReference オブジェクトを戻します。 クライアントは、このエンドポイント参照を使用して、プリンターを示すサービス・インスタンスにメッセージを送信します。

以下の例にある createPrinter メソッドは、 プリンター・サービスへのエンドポイント参照を作成します。 次に、そのオペレーションは、個々のプリンター・リソース・インスタンスの ID を取得し、 その ID をエンドポイント参照に関連付けます。 最後に、createPrinter メソッドは EndpointReference オブジェクトを W3CEndpointReference オブジェクトに変換し、変換したエンドポイント参照を戻します。このオブジェクトが、新規プリンターとなります。

import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
import com.ibm.websphere.wsaddressing.EndpointReference;
import com.ibm.websphere.wsaddressing.jaxws.EndpointReferenceConverter;
import com.ibm.websphere.wsaddressing.jaxws.W3CEndpointReference;

import javax.xml.namespace.QName;

public class MyClass {

    // Create the printer
    ...

    // Define the printer resource ID as a static constant as it is required in later steps
    public static final QName PRINTER_ID_PARAM_QNAME = new QName("example.printersample","IBM_WSRF_PRINTERID", "ws-rf-pr" );
    public static final QName PRINTER_SERVICE_QNAME = new QName("example.printer.com", "printer", "..."); 
    public static final String PRINTER_ENDPOINT_NAME = new String("PrinterService");
    
    public W3CEndpointReference createPrinter(java.lang.Object createPrinterRequest)
    			throws Exception {
     // Create an EndpointReference that targets the appropriate WebService URI and port name.
     EndpointReference epr =  EndpointReferenceManager.createEndpointReference(PRINTER_SERVICE_QNAME, PRINTER_ENDPOINT_NAME);

     // Create or lookup the stateful resource and derive a resource
     // identifier string.
     String resource_identifier = "...";

     // Associate this resource identifier with the EndpointReference as  
     // a reference parameter.
     // The choice of name is arbitrary, but should be unique     
     // to the service.
     epr.setReferenceParameter(PRINTER_ID_PARAM_QNAME,resource_identifier);
     // The endpoint reference now targets the resource rather than the service.
     ...

     return EndpointReferenceConverter.createW3CEndpointReference(epr);
    }
}

これまでに説明した Web サービス実装によって、 プリンター・リソース・インスタンスには、 そのエンドポイント参照で固有の ID が組み込まれます。 この ID は、Web サービスをターゲットとする、 後続のメッセージの SOAP ヘッダーで、 参照パラメーターになります。 また、Web サービスが着信メッセージを 適切なプリンターとマッチングさせるために、 この ID を使用できます。

web サービスが、WS-Addressing メッセージのアドレッシング・プロパティーを含むメッセージを 受信すると、WebSphere Application Server は、メッセージがアプリケーションのエンドポイントに ディスパッチされる前に、これらのプロパティーを処理し、スレッド上のメッセージ・コンテキストの中に、このプロパティーを設定します。 以下の例で説明されているとおり、 Printer Web サービス・アプリケーションは、WebServiceContext オブジェクトの ターゲット・エンドポイントに関連付けられている、 参照パラメーターにアクセスします。

import com.ibm.websphere.wsaddressing.EndpointReferenceManager;
...
 // Initialize the reference parameter name
 QName name = new QName(..);
 // Extract the String value.
 String resource_identifier = 
        EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);

Web サービス実装は、getReferenceParameterFromMessageContext メソッドから獲得したプリンター ID に基づいて、メッセージを適切なプリンター・インスタンスに転送できます。

クライアントはプリンターの JAX-WS プロキシーを作成し、そのプロキシーを BindingProvider オブジェクトに変換します。次に、クライアントは以下の例にあるように、あらかじめ取得しておいた EndpointReference オブジェクトを BindingProvider の要求コンテキストに関連付けます。
import javax.xml.ws.BindingProvider;
...

 javax.xml.ws.Service service= ...;
 Printer myPrinterProxy = service.getPort(portName, Printer.class);
	
 javax.xml.ws.BindingProvider bp = (javax.xml.ws.BindingProvider)myPrinterProxy;
	 
 // Retrieve the request context for the BindingProvider object
 Map myMap = myBindingProvider.getRequestContext();

 // Associate the endpoint reference that represents the new printer to the request context 
 // so that the BindingProvider object now represents a specific printer instance.
 myMap.put(WSADDRESSING_DESTINATION_EPR, destinationEpr);

...
これで、BindingProvider オブジェクトは、新規プリンター・リソース・インスタンスとなります。 クライアントはこのオブジェクトを使用して、Printer Web サービス経由でメッセージをプリンターに送信することができます。 クライアントが BindingProvider オブジェクトを起動するときに、WebSphere Application Server は該当するメッセージ・アドレッシング・プロパティーをメッセージ・ヘッダーに追加します。 この場合、このプロパティーが、ターゲット・プリンター・リソースを識別する エンドポイント参照内に含まれる参照パラメーターになります。

代わりに、クライアントは JAX-RPC Stub オブジェクトまたは Call オブジェクトを使用することができます。クライアントはこれらを、新規プリンターを表すように構成します。 Call オブジェクトの使用方法は、以下の例のようになります。

import javax.xml.rpc.Call;
...
 :
 // Associate the endpoint reference that represents the new printer with the call.
 call.setProperty(
        "com.ibm.websphere.wsaddressing.WSAConstants.
                             WSADDRESSING_DESTINATION_EPR ", epr);

クライアント側から見ると、エンドポイント参照は不透明です。 クライアントは、いずれのエンドポイント参照パラメーターの内容も解釈できず、 完全に使用できません。 クライアントは、エンドポイント参照のインスタンスを直接作成できません。 これは、参照パラメーターが、サービス・プロバイダー専用になっているためです。 クライアントは、サービス・プロバイダーからエンドポイント参照を取得し (例えば、プロバイダー・ファクトリー・サービスを通じて)、 そのエンドポイント参照を使用して、 エンドポイント参照によって表されている エンドポイントに、Web サービス・オペレーションを送信する必要があります。

次のタスク


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_wsa_rap
ファイル名:twbs_wsa_rap.html