Web サービス記述言語 (WSDL) 拡張を作成して、WSIF
(Web Services Invocation Framework) サービスが、
トランスポート・メカニズムとして JMS (Java™
Message Service) を使用する SOAP サービスにアクセスできるようにします。
始める前に
このトピックでは、WebSphere® Application Server のインストール時に、JMS プロバイダー (デフォルトのメッセージング・プロバイダー、または WebSphere MQ メッセージング・プロバイダーなどの他のプロバイダーのいずれか) が選択され、構成されていることを前提としています。
まだ実行されていない場合は、
メッセージング・プロバイダーの選択の説明に従ってここで実行してください。
このタスクについて
SOAP メッセージに XML しか含まれていない場合は、Java
Message Service (JMS) メッセージの
本文タイプ TextMessage を使用して JMS トランスポート・メカニズム上で送信できます。
SOAP メッセージは、SOAP エンベロープも含めて、JMS メッセージでラップされ、適切なキューに配置されます。
コンテナーは、JMS メッセージを受信すると、SOAP メッセージを除去してクライアントに送信します。
以下の手順とそれに関連したコード・フラグメントを
使用すると、Web サービス記述言語 (WSDL) 拡張を作成して、WSIF サービスが SOAP over JMS サービスに
アクセスできるようにすることができます。
注: SOAP over JMS バインディングは SOAP over HTTP バインディングとほとんど同じであるため、
この手順を、SOAP over HTTP の WSDL バインディング拡張を作成する際の
ガイドとして使用することもできます。
手順
- SOAP over JMS バインディングを選択します。
<soap:binding> タグの transport 属性を、JMS の使用を表すように設定します。
さらに、以下のように style 属性を rpc (リモート・プロシージャー・コール) に設定する場合、Web Services Invocation Framework (WSIF) は、操作が Web サービス・エンドポイントで呼び出されたものと想定します。
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/jms"/>
- JMS アドレスを設定します。
注: JMS アドレスを指定するための別の方法も
参照してください (この直後のステップで説明します)。
SOAP over JMS の場合、<wsdl:port> タグに <jms:address> エレメントが
含まれていなければなりません。このエレメントには、クライアントが JMS プログラミング・モデルを使用して Web サービスに正しく接続するために必要な情報が含まれています。これは通常、JMS クライアントの役目をする JMS を介した SOAP バインディングをサポートするために生成されるスタブです。
これ以外の方法としては、Web サービス・クライアントは直接 JMS プログラミング・モデルを使用できます。
<jms:address> エレメントは、以下の形式で示されます。
<jms:address
destinationStyle= "queue"
jmsVendorURI = "http://ibm.com/ns/mqseries"?
initialContextFactory= "com.ibm.NamingFactory"?
jndiProviderURL= "iiop://something:900/wherever"?
jndiConnectionFactoryName= "orange"
jndiDestinationName= "fred">
<jms:propertyValue name="targetService" type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
ここで、疑問符 (
?) でマークされた属性は、オプションです。
オプションの jmsVendorURI 属性は、JMS 実装を一意的に識別するストリングです。WSIF はこの URI を無視します。これはクライアント開発者によって、また場合によってはクライアント実装で使用され、クライアント・ランタイム環境で適切な JMS プロバイダーへのアクセス権があるかどうかが判断されます。
オプション属性 initialContextFactory および
jndiProviderURL は、ランタイム環境にデフォルトの Java
Naming and Directory Interface (JNDI) プロバイダーが構成されている場合にのみ省略できます。
jndiConnectionFactoryName 属性は JMS ConnectionFactory オブジェクトの名前を指定しますが、このオブジェクトは jndiContext 属性で指定される JNDI コンテキスト内で検索することができます。
この ConnectionFactory オブジェクトを使用して、このキューを所有する JMS プロバイダー・インスタンスに対する JMS 接続を作成します。
構成を単純にする場合は、サーバー・メッセージ・リスナーとクライアントが同一の ConnectionFactory オブジェクトを使用します。
ただし、サーバーとクライアントがすべて同じ JMS プロバイダー・インス
タンスに接続する場合は、別々の
ConnectionFactory オブジェクトを使用することができます。
targetService <jms:propertyValue> エレメントの value 属性は、
ターゲット・サービスの webservices.xml ファイルの <port-component-name> エレメントで
定義した、ターゲット・サービスのポート・コンポーネント名です。
- JMS アドレスを設定します (代替方法)。
SOAP over JMS プロバイダーでは、
代わりに以下のフォーマットの <soap:address> タグを使用して JMS アドレスを指定することもできます。
jms:/[queue|topic]?<property>=<value>&<property>=<value>&...
ここで、
queue または
topic の指定は、
JMS アドレスの
destinationStyle 属性に対応します。
表 1. <soap:address> タグで使用する場合の有効なプロパティー. 1 列目にはプロパティー名を、2 列目にはそのプロパティーの説明を、3 列目にはそれに対応する JMS アドレス値を示します。プロパティー名 |
プロパティーの説明 |
対応する JMS アドレス値 |
destination |
宛先キューまたはトピックの JNDI 名 |
jndiDestinationName |
connectionFactory |
接続ファクトリーの JNDI 名。 |
jndiConnectionFactory |
targetService |
ターゲット・サービスのポート・コンポーネント名 |
targetService jms:propertyValue within jms:address |
JNDI 関連のプロパティー (オプション) |
initialContextFactory |
初期コンテキスト・ファクトリーの名前 |
initialContextFactory |
jndiProviderURL |
JNDI プロバイダー URL |
jndiProviderURL |
JMS 関連のプロパティー (オプション) |
deliveryMode |
要求メッセージをパーシスタントにするかどうかを指示します。
有効な値は DeliveryMode.NON_PERSISTENT (デフォルト)
と DeliveryMode.PERSISTENT です。 |
JMSDeliveryMode |
password |
接続ファクトリーに対するアクセスの取得に使用するパスワード。 |
JMSPassword |
priority |
要求メッセージに関連付けられた JMS 優先順位。有効な値は 0 から 9 です。
デフォルト値は 4 です。 |
JMSDeliveryMode |
replyTo |
応答メッセージが送信される、JNDI 宛先キュー。 |
JMSReplyTo |
timeToLive |
要求メッセージの存続時間 (ミリ秒単位)値 0 は、無制限に存続することを表します。 |
JMSTimeToLive |
userid |
接続ファクトリーに対するアクセスの取得に使用するユーザー ID。 |
JMSUserid |
以下にこのフォーマットの例を示します。
<jms:address> のフォーマット:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
<soap:address> のフォーマット:
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<soap:address location="jms:/queue?connectionFactory=myQCF&destination
=myQ&initialContextFactory=com.ibm.NamingFactory&jndiProviderURL
=iiop://something:900/&targetService=StockQuoteServicePort" />
</wsdl:port>
- JMS ヘッダーおよびプロパティーを設定します。
<jms:property> タグを使用して、
JMS ヘッダーおよびプロパティーを設定します。次のタグは、メッセージ・パーツまたはリテラル値のいずれかを JMS プロパティーにマップします。
<jms:property name="Priority" {part="requestPriority" | value="fixedValue"}/>
次のように <jms:property> がリテラル値を持つ場合、
<jms:address> タグ内にネストすることもできます。
<jms:property name="Priority" value="fixedValue" />
この
形式の <jms:property> タグは、ネイティブ JMS バインディングでも使用されます。
SOAP over JMS バインディングを定義する WSDL の例
<!-- Example: SOAP over JMS Text Message -->
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions
name="StockQuoteInterfaceDefinitions"
targetNamespace="urn:StockQuoteInterface"
xmlns:tns="urn:StockQuoteInterface"
xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:jms="http://schemas.xmlsoap.org/wsdl/jms/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:message name="GetQuoteInput">
<part name="symbol" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="GetQuoteOutput">
<part name="value" type="xsd:float"/>
</wsdl:message>
<wsdl:portType name="StockQuoteInterface">
<wsdl:operation name="GetQuote">
<wsdl:input message="tns:GetQuoteInput"/>
<wsdl:output message="tns:GetQuoteOutput"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StockQuoteSoapJMSBinding" type="tns:StockQuoteInterface">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/jms"/>
<wsdl:operation name="GetQuote">
<soap:operation soapAction="urn:StockQuoteInterface#GetQuote"/>
<wsdl:input>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:input>
<wsdl:output>
<soap:body use="encoded" namespace="urn:StockQuoteService"
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StockQuoteService">
<wsdl:port name="StockQuoteServicePort"
binding="sqi:StockQuoteSoapJMSBinding">
<jms:address destinationStyle="queue"
jndiConnectionFactoryName="myQCF"
jndiDestinationName="myQ"
initialContextFactory= "com.ibm.NamingFactory"
jndiProviderURL="iiop://something:900/">
<jms:propertyValue name="targetService"
type="xsd:string"
value="StockQuoteServicePort"/>
</jms:address>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>