ネイティブ JMS (Java Message Service) プロバイダーを使用すると、 WSIF クライアントは、JMS 宛先で使用可能なサービスを Web サービスとして扱うことができます。 この情報とそれに関連したコード・フラグメントを使用すると、WSDL 拡張を作成することができます。
Java Message Service (JMS) API での作業について詳しくは、WSIF サービスの JMS 提供のサービスへのリンクを参照してください。
JMS 用の WSDL 拡張は、 ネーム・スペースの接頭部 jms で識別されます。例えば、<jms:binding> のようになります。
サポートされているオペレーションは、片方向オペレーション (JMS point-to-point メッセージングの場合は send、JMS パブリッシュ/サブスクライブ・メッセージングの場合は publish)、 または要求/応答オペレーション (JMS point-to-point メッセージングの場合は send および receive) のいずれかです。したがって、WSDL オペレーションは、 入力メッセージのみを指定、または入力メッセージと出力メッセージを指定します。
ネイティブ JMS バインディングによるメッセージ・インターフェースを記述するオペレーションには、障害メッセージがありません。 メッセージ・スキーマや、メッセージ・プロパティーのセマンティクスに関する前提事項がないため、出力メッセージと障害メッセージは区別できません。
<wsdl:binding ... > <jms:binding type="messageBodyType" /> ... </wsdl:binding>ここで、messageBodyType は ObjectMessage または TextMessage のいずれかです。
WSDL メッセージの 1 つ以上のパーツから作成される JMS テキスト・メッセージ と JMS オブジェクト・メッセージの場合、<jms:input> および <jms:output> 拡張を用いて、JMS メッセージに使用するメッセージ・パーツを指定します。
<wsdl:input ... > <jms:input parts="part1 part2 ..." /> </wsdl:input> <wsdl:output ... > <jms:output parts="part1 part2 ..." /> </wsdl:output>
次の例では、WSDL メッセージに、完全なメッセージ本文を含む部分が 1 つだけ含まれています。 このメッセージ本文は、他の表記のマッピングによって得られます (「データ型のマッピング」の項目を参照)。
<wsdl:input ... > <jms:input parts="part1" /> </wsdl:input>
どの部分も定義されない場合は、メッセージのすべての部分が使用されます。
データ型をマップするには、<format> 拡張を使用します。
<wsdl:binding ... > <jms:binding type="..." /> <format:typeMapping encoding="Java" style="Java"> <format:typeMap typeName="..." formatType="targetType"/> </format:typemapping> ... </wsdl:binding>
targetType の値は、JMS メッセージ本文タイプに依存します (「JMS メッセージ本文タイプの設定」の項目を参照)。 JMS オブジェクト・メッセージの場合、ターゲット・データ型は java.io.Serializable クラスをインプリメントします。JMS テキスト・メッセージの場合、ターゲット・データ型は常に java.lang.String です。
<format> 拡張は、Java インターフェースを扱う他のバインディングでも使用されます。
JMS では、メッセージ・ヘッダーについ ての前提事項はありません。 例えば、JMS プロバイダーが MQSeries である場合、各 JMS メッセージには RFH2 ヘッダーが組み込まれます。 ただし、JMS メッセージ・プロパティーを入手して設定することによって、このメッセージ・ヘッダー内のデータに間接的にアクセスできます。
アプリケーションが WSIF メッセージの一部として Web Services Invocation Framework (WSIF) に プロパティーを渡すようにする場合は、 <jms:property> タグを使用します。実際のプロパティー値を WSDL に ハードコーディングする場合は、<jms:propertyValue> タグを 使用します。<jms:propertyValue> タグには、リテラル値と、それに関連付けられている XML スキーマ型の 指定が含まれています。
バインディング操作での <wsdl:input> タグ内、 および <jms:address> タグ内にも、<jms:property> および <jms:propertyValue> 拡張を指定できます。バインディング 操作での <wsdl:output> タグには、<jms:property> 拡張しか指定できません。<jms:property> タグに 設定されるプロパティー値は、<<jms:propertyValue> タグに 設定される値よりも優先され、バインディング操作で (<input> および <output> タグに) 設定されるプロパティー値は、<jms:address> タグに 設定される値よりも優先されます。
以下に、<input> および <output> タグ内にネストされた <jms:property> タグ および <jms:propertyValue> タグの例を示します。
<wsdl:input ... > <jms:property name="propertyName" part="partName" /> <jms:propertyValue name="propertyName" type="xsdType" value="actualValue" /> </wsdl:input> <wsdl:output ... > <jms:property name="propertyName" part="partName" /> </wsdl:output>
ここで、propertyName は、ヘッダー・フィールドに関連付けられている JMS プロパティーを表し、partName は、プロパティーに関連付けられているメッセージ・パーツを表します。
propertyName によって識別される JMS プロパティーは、ユーザー定義か、 または以下の事前定義済みの JMS メッセージ・ヘッダー・フィールドのいずれかになります。
値 | Java 型 |
---|---|
JMSMessageId | java.lang.String |
JMSTimeStamp | long |
JMSCorrelationId | byte [] または java.lang.String |
JMSReplyTo | javax.jms.Destination |
JMSDestination | javax.jms.Destination |
JMSDeliveryMode | int |
JMSRedelivered | ブール |
JMSType | java.lang.String |
JMSExpiration | long |
JMSTimeToLive | long |
JMS ヘッダー・フィールド値の設定時に適用される制約事項については、JMS 仕様を参照してください。 制限された値を設定しようとしても無視されます。
アプリケーションで 定義済みの JMS メッセージ・プロパティーでは、ネイティブ JMS バインディング実装で 使用される (それに対応する JMS メソッド呼び出しで使用される) Java 型は、抽象インターフェース の XML スキーマ型 (<wsdl:part> タグ)、およびフォーマット・バインディングの型マッピング 情報 (<format:typemap> タグ) から派生します。
要求/応答オペレーションの非同期処理は、他の JMS プロパティーとは別に、トランザクション有効範囲で動作する呼び出し元に影響を与えます。 要求メッセージを可視にするためには、送信をコミットする必要があるため、送信要求部分と受信応答部分は 、2 つのトランザクションに分けられます。 したがって、非同期の要求/応答オペレーション (WSIF など) のために WSDL を処理するインプリメンテーションは、これ以外にも次のようなアクションを実行する必要があります。
JMS テキスト・メッセージには、java.lang.String が含まれています。この例では、WSDL メッセージにメッセージ本文全体の一部のみが含まれています。
<wsdl:definitions ... > <!-- simple or complex types for input and output message --> <wsdl:types> ... </wsdl:types> <wsdl:message name="JmsOperationRequest"> ... </wsdl:message> <wsdl:message name="JmsOperationResponse"> ... </wsdl:message> <wsdl:portType name="JmsPortType"> <wsdl:operation name="JmsOperation"> <wsdl:input name="Request" message="tns:JmsOperationRequest"/> <wsdl:output name="Response" message="tns:JmsOperationResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="JmsBinding" type="JmsPortType"> <jms:binding type="TextMessage" /> <format:typemapping style="Java" encoding="Java"> <format:typemap name="xsd:String" formatType="String" /> </format:typemapping> <wsdl:operation name="JmsOperation"> <wsdl:input message="JmsOperationRequest"> <jms:input parts="requestMessageBody" /> </wsdl:input> <wsdl:output message="JmsOperationResponse"> <jms:output parts="responseMessageBody" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="JmsService"> <wsdl:port name="JmsPort" binding="JmsBinding"> <jms:address destinationStyle="queue" jndiConnectionFactoryName="myQCF" jndiDestinationName="myDestination"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
前述の JMS メッセージ例の拡張として、以下の WSDL の例は、要求/応答オペレーションを記述します。このオペレーションでは、要求および応答メッセージの特定の JMS プロパティー値が、要求メッセージに設定され、応答メッセージから取り出されます。
要求メッセージの JMS プロパティーは、入力メッセージの値に従って設定されます。 同様に、応答メッセージ用に選択された JMS プロパティーは、出力メッセージの対応する値にコピーされます。マッピングの方向は、 入力セクションまたは出力セクションの <jms:property> タグの 外観によって、それぞれ判別されます。
<wsdl:definitions ... > <!-- simple or complex types for input and output message --> <wsdl:types> ... </wsdl:types> <wsdl:message name="JmsOperationRequest"> <wsdl:part name="myInt" type="xsd:int"/> ... </wsdl:message> <wsdl:message name="JmsOperationResponse"> <wsdl:part name="myString" type="xsd:String"/> ... </wsdl:message> <wsdl:portType name="JmsPortType"> <wsdl:operation name="JmsOperation"> <wsdl:input name="Request" message="tns:JmsOperationRequest"/> <wsdl:output name="Response" message="tns:JmsOperationResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="JmsBinding" type="JmsPortType"> <!-- the JMS message type may be any of the above --> <jms:binding type="..." /> <format:typemapping style="Java" encoding="Java"> <format:typemap name="xsd:int" formatType="int" /> ... </format:typemapping> <wsdl:operation name="JmsOperation"> <wsdl:input message="JmsOperationRequest"> <jms:property message="tns:JmsOperationRequest" parts="myInt" /> <jms:propertyValue name="myLiteralString" type="xsd:string" value="Hello World" /> ... </wsdl:input> <wsdl:output message="JmsOperationResponse"> <jms:property message="tns:JmsOperationResponse" parts="myString" /> ... </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="JmsService"> <wsdl:port name="JmsPort" binding="JmsBinding"> <jms:address destinationStyle="queue" jndiConnectionFactoryName="myQCF" jndiDestinationName="myDestination"/> </wsdl:port> </wsdl:service> </wsdl:definitions>