14.5. WSDL を使用した JMS の設定

14.5.1. JMS WSDL Extension Namespance

JMS エンドポイントを定義するための WSDL 拡張機能は、名前空間 http://cxf.apache.org/transports/jms で定義されています。JMS 拡張機能を使用するには、例14.5「JMS WSDL 拡張名前空間」 に示す行をコントラクトの定義要素に追加する必要があります。

例14.5 JMS WSDL 拡張名前空間

xmlns:jms="http://cxf.apache.org/transports/jms"

14.5.2. 基本の JMS 設定

概要

JMS アドレス情報は、jms:address 要素とその子 (jms:JMSNamingProperties 要素) を使用して提供されます。jms:address 要素の属性は、JMS ブローカーおよび宛先を識別するのに必要な情報を指定します。jms:JMSNamingProperties 要素は、JNDI サービスへの接続に使用される Java プロパティーを指定します。

重要

JMS 機能を使用して指定された情報は、エンドポイントの WSDL ファイルの情報を上書きします。

JMS アドレスの指定

JMS エンドポイントの基本設定は、jms:address 要素をサービスの port 要素の子として使用して行われます。WSDL で使用される jms:address 要素は、設定ファイルで使用されるものと同じです。その属性は、表14.2「JMS エンドポイント属性」 にリスト表示されます。

表14.2 JMS エンドポイント属性

属性説明

destinationStyle

JMS 宛先が JMS キューまたは JMS トピックであるかどうかを指定します。

jndiConnectionFactoryName

JMS 宛先に接続するときに使用する JMS 接続ファクトリーにバインドされた JNDI 名を指定します。

jmsDestinationName

要求の送信先の JMS 宛先の JMS 名を指定します。

jmsReplyDestinationName

応答が送信される JMS 宛先の JMS 名を指定します。この属性を使用すると、ユーザー定義の宛先を返信に使用できます。詳細は 「名前付き応答宛先の使用」 を参照してください。

jndiDestinationName

要求の送信先の JMS 宛先にバインドされた JNDI 名を指定します。

jndiReplyDestinationName

応答が送信される JMS 宛先にバインドされた JNDI 名を指定します。この属性を使用すると、ユーザー定義の宛先を返信に使用できます。詳細は 「名前付き応答宛先の使用」 を参照してください。

connectionUserName

JMS ブローカーに接続するときに使用するユーザー名を指定します。

connectionPassword

JMS ブローカーに接続するときに使用するパスワードを指定します。

jms:address WSDL 要素は、jms:JMSNamingProperties 子要素を使用して、JNDI プロバイダーへの接続に必要な追加情報を指定します。

JNDI プロパティーの指定

JMS および JNDI プロバイダーとの相互運用性を高めるために、jms:address 要素には子要素 jms:JMSNamingProperties があり、JNDI プロバイダーへの接続時に使用されるプロパティーの設定に使用される値を指定できます。jms:JMSNamingProperties 要素には、namevalue の 2 つの属性があります。name は設定するプロパティーの名前を指定します。value 属性は、指定されたプロパティーの値を指定します。JMS:JMSNamingProperties 要素は、プロバイダー固有のプロパティーの仕様にも使用できます。

以下は、設定可能な一般的な JNDI プロパティーのリストです。

  1. java.naming.factory.initial
  2. java.naming.provider.url
  3. java.naming.factory.object
  4. java.naming.factory.state
  5. java.naming.factory.url.pkgs
  6. java.naming.dns.url
  7. java.naming.authoritative
  8. java.naming.batchsize
  9. java.naming.referral
  10. java.naming.security.protocol
  11. java.naming.security.authentication
  12. java.naming.security.principal
  13. java.naming.security.credentials
  14. java.naming.language
  15. java.naming.applet

これらの属性で使用する情報の詳細については、JNDI プロバイダーのドキュメントを確認し、JavaAPI リファレンス資料を参照してください。

例14.6「JMS WSDL ポート仕様」 は、JMS WSDL port 仕様の例を示しています。

例14.6 JMS WSDL ポート仕様

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
  </port>
</service>

14.5.3. JMS クライアント設定

概要

JMS コンシューマーエンドポイントは、使用するメッセージタイプを指定します。JMS コンシューマーエンドポイントは、JMS ByteMessage または JMS TextMessage を使用できます。

ByteMessage を使用する場合、コンシューマーエンドポイントは byte[] を、JMS メッセージボディーからデータを保存し、取得する方法として使用します。メッセージが送信されると、フォーマット情報を含むメッセージデータは byte[] にパッケージ化され、ネットワークに置かれる前にメッセージボディーに配置されます。メッセージが受信されると、コンシューマーエンドポイントは、メッセージボディーに格納されているデータを byte[] にパックしたかのようにアンマーシャルしようとします。

TextMessage を使用する場合、コンシューマーエンドポイントはメッセージボディーからデータを保存および取得するためのメソッドとして文字列を使用します。メッセージが送信されると、フォーマット固有の情報を含むメッセージ情報が文字列に変換され、JMS メッセージ本文に配置されます。メッセージを受け取ると、コンシューマーエンドポイントは、JMS メッセージボディーに格納されているデータを文字列にパックしたかのようにアンマーシャルしようとします。

ネイティブ JMS アプリケーションが Apache CXF コンシューマーと対話する場合、JMS アプリケーションはメッセージとフォーマット情報の解釈を担当します。たとえば、Apache CXF コントラクトで JMS エンドポイントに使用されるバインディングが SOAP であると指定され、メッセージが TextMessage としてパッケージ化されている場合、受信側の JMS アプリケーションは、すべての SOAP エンベロープ情報を含むテキストメッセージを取得します。

メッセージタイプの指定

JMS コンシューマーエンドポイントによって許可されるメッセージの型は、オプションの jms:client 要素を使用して設定されます。jms:client 要素は WSDL port 要素の子であり、属性が 1 つあります。

表14.3 JMS クライアントの WSDL 拡張

messageType

メッセージデータを JMS メッセージとしてパッケージ化する方法を指定します。text は、データを TextMessage としてパッケージ化することを指定します。binary は、データを ByteMessage としてパッケージ化することを指定します。

例14.7「JMS コンシューマーエンドポイントの WSDL」 は、JMS コンシューマーエンドポイントを設定するための WSDL を示しています。

例14.7 JMS コンシューマーエンドポイントの WSDL

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
    <jms:client messageType="binary" />
  </port>
</service>

14.5.4. JMS プロバイダーの設定

概要

JMS プロバイダーエンドポイントには、設定可能な多くの動作があります。これには以下が含まれます。

  • メッセージの相関方法
  • 永続サブスクリプションの使用
  • サービスがローカル JMS トランザクションを使用する場合
  • エンドポイントによって使用されるメッセージセレクター

設定の指定

プロバイダーエンドポイントの動作は、オプションの jms:server 要素を使用して設定されます。jms:server 要素は WSDL wsdl:port 要素の子で、以下の属性があります。

表14.4 JMS プロバイダーエンドポイント WSDL 拡張

属性説明

useMessageIDAsCorrealationID

JMS がメッセージ ID を使用してメッセージを関連付けるかどうかを指定します。デフォルトは false です。

durableSubscriberName

永続サブスクリプションの登録に使用される名前を指定します。

messageSelector

使用するメッセージセレクターの文字列値を指定します。メッセージセレクターを指定するために使用される構文の詳細については、JMS1.1 仕様 を参照してください。

transactional

ローカル JMS ブローカーがメッセージ処理に関するトランザクションを作成するかどうかを指定します。デフォルトは false です。 [a]

[a] 現在、transactional 属性を true に設定するとランタイムはサポートされません。

例14.8「JMS プロバイダーエンドポイントの WSDL」 は、JMS プロバイダーエンドポイントを設定するための WSDL を示しています。

例14.8 JMS プロバイダーエンドポイントの WSDL

<service name="JMSService">
  <port binding="tns:Greeter_SOAPBinding" name="SoapPort">
    <jms:address jndiConnectionFactoryName="ConnectionFactory"
                 jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
      <jms:JMSNamingProperty name="java.naming.factory.initial"
                             value="org.activemq.jndi.ActiveMQInitialContextFactory" />
      <jms:JMSNamingProperty name="java.naming.provider.url"
                             value="tcp://localhost:61616" />
    </jms:address>
    <jms:server messageSelector="cxf_message_selector"
                useMessageIDAsCorrelationID="true"
                transactional="true"
                durableSubscriberName="cxf_subscriber" />
  </port>
</service>