JMS コネクタについて

JMS コネクタにより、アプリケーションは選択した JMS 実装を使用してメッセージングを実行できます。この主な機能は次のとおりです。

  • 特定の宛先でのパブリッシュ/サブスクライブパターンのサポート。

  • 特定の宛先でのリスン/応答パターンのサポート。

  • 特定の宛先での固定または一時応答キューを使用した Publish-Consume 応答パターンのサポート。

  • JMS 2.0、1.1、および 1.0.2 仕様に完全に準拠。

コネクタの設定

特に設定しなくても、JMS コネクタにはメッセージのパブリッシュとコンシュームの両方を目的として微調整された一連のデフォルト値が用意されています。つまり、自分で設定する必要があるのは、使用する接続を選択することだけです。

この例では、メモリ内 ActiveMQ ブローカーの JMS コネクタへの最低限の接続を設定しています。

<jms:config name="JMS_Config">
  <jms:active-mq-connection/>
</jms:config>

グローバルデフォルトの定義

JMS config により、メッセージのコンシューム中およびパブリッシュ中にデフォルトとして使用される複数のパラメータを定義できます。この方法では、設定に関連するすべての操作のグローバルのデフォルト動作を定義し、カスタム動作が必要な操作でのみ各パラメータを上書きすることができます。

たとえば、この設定に関連付けられた操作でメッセージをコンシュームするときのデフォルトの selector の動作を定義できます。これはデフォルトでもあります。

<jms:config name="JMS_Config">
  <jms:active-mq-connection/>
  <jms:consumer-config selector="JMSType = `INVOICE`"/>
  <jms:producer-config timeToLive="60000"/>
</jms:config>

この場合、この設定に関連付けられた consume または listener のすべての操作ではデフォルトでこの selector を使用しますが、publish または publish-consume を実行するたびに、発信メッセージでは TTL が 60 秒となります。

このすべてのプロパティは必要に応じて操作レベルで上書きできます。より短い TTL でメッセージをパブリッシュする必要があるとすると、この設定を使用してパラメータを上書きすれば実現できます。

<jms:publish config-ref="JMS_Config" timeToLive="10000"/>

ブローカーへの接続

JMS 接続は、すべての接続に適用される全般的なパラメータのセットと、使用される実際のブローカー実装に関連する特定の設定によって定義されます。

JMS 仕様の選択

メインとなる一般的なパラメータは JMS specification です。これはサポートされるすべての仕様、つまり 2.01.11.0.2b.の中から選択するために使用されます。この specification は、この接続に関連付けられたブローカーによってサポートされる必要があります。サポートされない場合、接続は失敗します。
JMS 2.0 のみで使用できる機能は他の specification では機能しません。

認証用のログイン情報の提供

認証済み接続を確立するためには、connection 要素で username および password を設定する必要があります。

<jms:config name="JMS_Config">
  <jms:active-mq-connection username="${env.user}" password="${env.pass}"/>
</jms:config>

接続キャッシングの設定

ブローカーと接続して必要な操作を実行するために、JMS コネクタは複数のセッション、コンシューマ、プロデューサを作成します。これらは、アプリケーションのパフォーマンスを高めるためにキャッシュして再利用できます。この機能により、JMS コネクタでは新しい接続を作成するときにどの caching-strategy を使用するか設定できます。これにより、デフォルトでコンシューマとプロデューサの両方をキャッシュし、それと同時にできるだけ多くのインスタンスをメモリに保持しておくことができます。

キャッシュ設定は、接続宣言内で直接カスタマイズすることができます。

<jms:config name="JMS_Config">
  <jms:active-mq-connection>
    <jms:caching-strategy>
      <jms:default-caching sessionCacheSize="100" consumersCache="false" producersCache="true"/>
    </jms:caching-strategy>
  </jms:active-mq-connection>
</jms:config>

同じように、no-caching オプションを使用して接続のキャッシングを完全に無効にすることができます。

<jms:config name="JMS_Config">
  <jms:generic-connection connectionFactory="customConnectionFactory">
    <jms:caching-strategy>
        <jms:no-caching/>
    </jms:caching-strategy>
  </jms:generic-connection>
</jms:config>
no-caching 設定を使用してセッションキャッシュを無効にするのは極力お勧めしません。すでに独自のキャッシュを処理しているカスタム ConnectionFactory が使用される場合にはこの方法を使用します。

接続クライアントの識別

クライアント識別子の目的は、接続およびそのオブジェクトをクライアントの代わりにプロバイダによって保持される状態と関連付けることであり、共有されていない永続的なサブスクリプションを識別するために​必要​です。

<jms:config name="JMS_Config">
  <jms:active-mq-connection clientId="${env.clientId}"/>
</jms:config>
定義としては、clientId によって識別されるクライアントの状態は一度に 1 つの接続によってのみ「使用中」にできます。

ActiveMQ への接続

ActiveMQ 5 のサポートは、特に設定しなくても active-mq-connection を使用するコネクタによって提供されます。この接続により、JMS 1.1 (デフォルト) または JMS 1.0.2b 仕様の両方を使用し、JMS の全般的なすべての接続パラメータを設定し、ActiveMQ でのみ表示されるカスタムパラメータを設定できます。

active-mq-connection を宣言すると、あとはカスタム設定で接続ファクトリをセットアップするだけです。接続のすべてのパラメータにはデフォルト値があります。つまり、自分のユースケースに関連するパラメータのみを設定する必要があります。また、ActiveMQ 接続では initialRedeliveryDelay などの ActiveMQ 実装を除くパラメータが表示されます。

ActiveMQ 接続のシンプルな設定例は次のようになります。

 <jms:config name="JMS_Config">
  <jms:active-mq-connection >
   <jms:factory-configuration brokerUrl="tcp://localhost:61616" />
  </jms:active-mq-connection>
 </jms:config>

別のブローカーの使用

ActiveMQ 5 が選択したブローカーではない場合、generic-connection を使用して任意のブローカー実装への接続を宣言できます。特に設定しなくても、コネクタには JNDI ベースの接続ファクトリビルダーが用意されており、これによってアプリケーションのコンテキストで JNDI を使用して接続を設定できます。

たとえば、JMS 2.0 仕様を使用するために Artemis と接続するには、次のように接続ファクトリを定義することもできます。

<jms:config name="JMS_Config">
    <jms:generic-connection specification="JMS_2_0">
        <jms:connection-factory>
            <jms:jndi-connection-factory connectionFactoryJndiName="ConnectionFactory" lookupDestination="ALWAYS">
                <jms:name-resolver-builder
                        jndiInitialContextFactory="org.apache.activemq.artemis.ActiveMQInitialContextFactory"
                        jndiProviderUrl="tcp://localhost:61616?broker.persistent=false&amp;broker.useJmx=false">
                    <jms:provider-properties>
                        <jms:provider-property key="queue.jndi-queue-in" value="in.queue"/>
                        <jms:provider-property key="topic.jndi-topic-in" value="in.topic"/>
                    </jms:provider-properties>
                </jms:name-resolver-builder>
            </jms:jndi-connection-factory>
        </jms:connection-factory>
    </jms:generic-connection>
</jms:config>

コネクタで JNDI コンテキストを設定した場合は、lookupDestination 属性を使用して JNDI 経由で宛先をルックアップすることもできます。この属性により、3 つの異なる設定が提供されます。

  • NEVER (指定しない): ルックアップは実行されず、宛先は既存の JMS セッションを使用して作成されます。

  • TRY_ALWAYS: 最初は JNDI を使用して宛先を探そうと試みて、存在しない場合は、現在の JMS セッションを使用して作成します。

  • ALWAYS (常時): JNDI 経由でキュー/トピックが見つからない場合、失敗して JMS:DESTINATION_NOT_FOUND エラーが発生します。

generic-connection または jndi-connection-factory についての詳細は、コネクタリファレンスドキュメントを参照してください。

接続の必須のライブラリのセットアップ

使用している接続の種別に関係なく、​JMS クライアント実装​が含まれるライブラリは常に設定する必要があります。これは、コネクタが特定の実装にバインドされていないためです。

ActiveMQ の外部ライブラリ

ActiveMQ 接続では、接続設定に応じて設定する必要がある可能性のあるライブラリが 3 つあります。

  • ActiveMQ JMS クライアントライブラリ:

有効な org.apache.activemq.ActiveMQConnectionFactory 実装を提供する選択した activemq-client

この連動関係は常に必須です。

たとえば、次のように設定します。

<dependency>
     <groupId>org.apache.activemq</groupId>
     <artifactId>activemq-client</artifactId>
     <version>5.14.5</version>
 </dependency>
  • ActiveMQ ブローカーライブラリ:

activemq-broker は VM トランスポート (デフォルトで設定される) に基づいて​メモリ内ブローカーを使用する場合のみ必須​です。この連動関係は、有効な org.apache.activemq.broker.Broker 実装を提供する必要があります。

たとえば、次のように設定します。

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-broker</artifactId>
    <version>5.14.5</version>
</dependency>
  • ActiveMQ KahaDB ライブラリ:

activemq-kahadb-store は VM トランスポート (つまり、vm://localhost?broker.persistent=true) に基づいて persistent in-memory ブローカーを使用する場合のみ必須​です。 この連動関係は、有効な org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter 実装を提供する必要があります。

たとえば、次のように設定します。

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-kahadb-store</artifactId>
    <version>5.14.5</version>
</dependency>

汎用外部ライブラリ

jms:generic-connection を使用する場合、ConnectionFactory および選択した設定に必要なすべてのライブラリを提供する必要もあります。これは、常に選択した実装によって異なるため、すべての連動関係をアプリケーションに追加するときは慎重に行ってください。

この一般的なユースケースとしては、JMS 2.0 仕様を使用するため、Apache Artemis などの異なるクライアントライブラリとの汎用接続が必要な場合があります。

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-kahadb-store</artifactId>
    <version>5.14.5</version>
</dependency>

Was this article helpful?

💙 Thanks for your feedback!

Edit on GitHub