13.2. JMS URI

概要

SOAP/JMS を使用する場合、JMS URI を使用してエンドポイントのターゲット宛先を指定します。URI に 1 つ以上のオプションを追加すると、JMS 接続の設定に JMS URI を使用することもできます。これらのオプションは、IETF 標準、URI Scheme for Java Message Service 1.0 で説明されています。これらを使用して、JNDI システム、応答先、使用する配信モード、およびその他の JMS プロパティーを設定できます。

構文

例13.4「JMS URI オプションの構文」 にあるように、JMS URI の最後にオプションを 1 つ以上追加するには、宛先のアドレスに疑問符 (?) で区切ります。複数のオプションはアンパサンド (&) で区切られます。例13.4「JMS URI オプションの構文」 は、JMS URI で複数のオプションを使用するための構文を示しています。

例13.4 JMS URI オプションの構文

jms:variant:jmsAddress?option1=value1&option2=value2&_optionN_=valueN

JMS プロパティー

表13.2「URI オプションとして設定された JMS プロパティー」 は、JMS トランスポート層に影響する URI オプションを示しています。

表13.2 URI オプションとして設定された JMS プロパティー

プロパティーデフォルト説明

conduitIdSelectorPrefix

 

[オプション] コンジットが作成するすべての相関 ID の前に付けられる文字列値。セレクターはこれを使用して応答をリッスンできます。

deliveryMode

PERSISTENT

JMS PERSISTENT または NON_PERSISTENT メッセージセマンティクスを使用するかどうかを指定します。PERSISTENT 配信モードの場合、JMS ブローカーはメッセージを承認する前に永続ストレージに保存します。一方、NON_PERSISTENT メッセージはメモリーにのみ保持されます。

durableSubscriptionClientID

 

[オプション] オプション接続のクライアント識別子を指定します。このプロパティーは、プロバイダーがクライアントに代わって維持する状態に接続を関連付けるために使用されます。これにより、同じアイデンティティーを持つ後続のサブスクライバーが残りの状態でサブスクリプションを再開できます。

durableSubscriptionName

 

(必要に応じて) サブスクリプションの名前を指定します。

messageType

byte

CXF によって使用される JMS メッセージタイプを指定します。有効な値は以下のとおりです。

  • byte
  • text
  • binary

password

 

[オプション] 接続を作成するためのパスワードを指定します。URI にこのプロパティーを追加することは推奨されません。

priority

4

0(最低) から 9(最高) の範囲の JMS メッセージ優先度を指定します。

receiveTimout

60000

要求/応答交換が使用されるときにクライアントが応答を待機する時間をミリ秒単位で指定します。

reconnectOnException

true

[CXF3.0 での非推奨] 例外が発生したときにトランスポートを再接続するかどうかを指定します。

3.0 の時点では、例外の発生時に常にトランスポートが再接続されます。

replyToName

 

[任意] キューメッセージの応答先を指定します。応答宛先が JMSReplyTo ヘッダーに表示されます。このプロパティーを設定することは、要求/応答セマンティクスを持つアプリケーションに推奨されます。これは、JMS プロバイダーが一時応答キューが指定されていない場合に割り当てるためです。

このプロパティーの値は、JMS URI で指定されたバリアントに従って解釈されます。

  • jndi バリアント - JNDI によって解決された宛先キューの名前
  • queue バリアント - JMS を使用して解決された宛先キューの名前

sessionTransacted

false

トランザクションタイプを指定します。有効な値は以下のとおりです。

  • true - リソー出力カルトランザクション
  • false - JTA トランザクション

timeToLive

0

JMS プロバイダーがメッセージを破棄するまでの時間をミリ秒単位で指定します。0 の値は無限に存在することを示します。

topicReplyToName

 

[オプション] トピックメッセージの返信先を指定します。このプロパティーの値は、JMS URI で指定されたバリアントに従って解釈されます。

  • jndi-topic - JNDI によって解決された宛先トピックの名前
  • topic - JMS によって解決された宛先トピックの名前

useConduitIdSelector

true

コンジットの UUID をすべての相関 ID の接頭辞として使用するかどうかを指定します。

すべての Conduits に一意の UUID が割り当てられているため、このプロパティーを true に設定すると、複数のエンドポイントが JMS キューまたはトピックを共有できます。

username

 

[オプション] 接続の作成に使用するユーザー名を指定します。

JNDI プロパティー

表13.3「URI オプションとして設定可能な JNDI プロパティー」 は、このエンドポイントの JNDI を設定するために使用できる URI オプションを示しています。

表13.3 URI オプションとして設定可能な JNDI プロパティー

プロパティー説明

jndiConnectionFactoryName

JMS 接続ファクトリーの JNDI 名を指定します。

jndiInitialContextFactory

JNDI プロバイダーの完全修飾クラス名を指定します (javax.jms.InitialContextFactory タイプである必要があります)。java.naming.factory.initial Java システムプロパティーの設定と同等です。

jndiTransactionManagerName

Spring、Blueprint、または JNDI で検索される JTA トランザクションマネージャーの名前を指定します。トランザクションマネージャーが見つかると、JTA トランザクションが有効になります。sessionTransacted JMS プロパティーを参照してください。

jndiURL

JNDI プロバイダーを初期化する URL を指定します。java.naming.provider.url Java システムプロパティーの設定と同等です。

追加の JNDI プロパティー

プロパティー java.naming.factory.initial および java.naming.provider.url は、JNDI プロバイダーを初期化するために必要な標準のプロパティーです。ただし、JNDI プロバイダーが標準のプロパティーに加えてカスタムプロパティーをサポートする場合もあります。この場合、jndi-PropertyName 形式の URI オプションを設定することで、任意の JNDI プロパティーを設定できます。

たとえば、JNDI の SUN の LDAP 実装を使用している場合は、例13.5「JMS URI での JNDI プロパティーの設定」 のように JMS URI で JNDI プロパティー java.naming.factory.control を設定できます。

例13.5 JMS URI での JNDI プロパティーの設定

jms:queue:FOO.BAR?jndi-java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory

JMS プロバイダーが まだ 設定されていない場合は、オプションを使用して URI で必要な JNDI 設定の詳細を提供できます (表13.3「URI オプションとして設定可能な JNDI プロパティー」を参照)。たとえば、Apache ActiveMQ JMS プロバイダーを使用し、test.cxf.jmstransport.queue というキューに接続するようにエンドポイントを設定するには、例13.6「JNDI 接続を設定する JMS URI」 に示される URI を使用します。

例13.6 JNDI 接続を設定する JMS URI

jms:jndi:dynamicQueues/test.cxf.jmstransport.queue
?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory
&jndiConnectionFactoryName=ConnectionFactory
&jndiURL=tcp://localhost:61616

サービスの公開

JAX-WS 標準 publish() メソッドを使用して SOAP/JMS サービスを公開することはできません。代わりに、例13.7「SOAP/JMS サービスの公開」 のように Apache CXF の JaxWsServerFactoryBean クラスを使用する必要があります。

例13.7 SOAP/JMS サービスの公開

String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
    + "?jndiInitialContextFactory"
    + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
    + "&jndiConnectionFactoryName=ConnectionFactory"
    + "&jndiURL=tcp://localhost:61500";
Hello implementor = new HelloImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(Hello.class);
svrFactory.setAddress(address);
svrFactory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
svrFactory.setServiceBean(implementor);
svrFactory.create();

例13.7「SOAP/JMS サービスの公開」 のコードは、以下を行います。

エンドポイントのアドレスを表す JMS URI を作成します。

JaxWsServerFactoryBean をインスタンス化してサービスを公開します。

ファクトリー Bean の address フィールドをサービスの JMS URI で設定します。

ファクトリーによって作成されたサービスが SOAP/JMS トランスポートを使用するように指定します。

サービスの消費

標準の JAX-WS API を使用して SOAP/JMS サービスを使用することはできません。その代わりに、例13.8「SOAP/JMS サービスの使用」 のように Apache CXF の JaxWsProxyFactoryBean クラスを使用する必要があります。

例13.8 SOAP/JMS サービスの使用

// Java
public void invoke() throws Exception {
    String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
        + "?jndiInitialContextFactory"
        + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
        + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61500";
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setAddress(address);
    factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
    factory.setServiceClass(Hello.class);
    Hello client = (Hello)factory.create();
    String reply = client.sayHi(" HI");
    System.out.println(reply);
}

例13.8「SOAP/JMS サービスの使用」 のコードは、以下を行います。

エンドポイントのアドレスを表す JMS URI を作成します。

JaxWsProxyFactoryBean をインスタンス化してプロキシーを作成します。

ファクトリー Bean の address フィールドをサービスの JMS URI で設定します。

ファクトリーによって作成されたプロキシーが SOAP/JMS トランスポートを使用することを指定します。