Menu Close

13.2. JMS URI

概要

SOAP/JMS を使用する場合、JMS URI を使用してエンドポイントのターゲット宛先を指定します。JMS URI は、URI に 1 つ以上のオプションを追加して JMS コネクションを設定するために使用することもできます。これらのオプションは、IETF 標準仕様である Java Message Service 1.0 の URI スキーム で詳しく説明されています。それらは 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

[CXF 3.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 のプレフィックスとして使用するかどうかを指定します。

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

username

 

[任意] コネクションの作成に使用するユーザー名を指定します。

JNDI プロパティー

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

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

プロパティー説明

jndiConnectionFactoryName

JMS コネクションファクトリーの JNDI 名を指定します。

jndiInitialContextFactory

JNDI プロバイダーの完全修飾 Java クラス名を指定します (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 プロバイダーがまだ設定されていない 場合は、オプションを使用して必要な JNDI 設定の詳細を URI に提供できます (表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 トランスポートを使用することを指定します。