第31章 JMS ブリッジ

HornetQ には、完全に機能する JMS メッセージングブリッジが含まれ、ソースキューまたはトピックからメッセージを消費し、通常は異なるサーバー上のターゲットキューまたはトピックに送信します。
ソースおよびターゲットサーバーは同じクラスター内に属する必要がないため、あるクラスターから別のクラスター (WAN 間、および接続が信頼できない場合) に安定してメッセージを送信する場合にブリッジングが適切になります。
また、ブリッジは、JMS 1.1 に準拠する他の非 HornetQ JMS サーバーからメッセージをブリッジ接続するために使用できます。

重要

JMS ブリッジは、任意の 2 つの JMS 1.1 準拠 JMS プロバイダーをブリッジ接続するために使用でき、JMS API を使用します。コアブリッジ (34章コアブリッジ で説明) は任意の 2 つの HornetQ インスタンスをブリッジ接続するために使用され、コア API を使用します。コアブリッジは、通常 JMS ブリッジよりも優れたパフォーマンスを提供し、XA を使用せずに 1 度だけの配信保証を提供します。
ブリッジには、耐障害性が組み込まれているため、ソースまたはターゲットサーバー接続が失われた場合 (たとえば、ネットワーク障害のため)、ブリッジはオンライン状態に戻るまでターゲットサーバーに再接続しようとします。この時点で操作は通常に戻ります。
ブリッジは、オプションの JMS セレクターで設定できるため、その JMS セレクターに一致するメッセージのみを消費します。
これは、キューまたはトピックから消費するよう設定できます。これは、トピックから消費するときに、非耐性または耐性サブスクライブを使用して消費するよう設定できます。
ブリッジは通常、JBOSS_DIST/jboss-as/server/PROFILE/deploy にある Bean 設定ファイル (jms-bridge-jboss-beans.xml) を使用して JBoss Microcontainer によってデプロイされます。
例31.1「jms-bridge-jboss-beans.xml サンプル設定」 は、同じサーバーで 2 つの宛先をブリッジ接続する設定例を示しています。

例31.1 jms-bridge-jboss-beans.xml サンプル設定

<?xml version="1.0" encoding="UTF-8"?>

<deployment xmlns="urn:jboss:bean-deployer:2.0">

  <bean name="JMSBridge" class="org.hornetq.api.jms.bridge.impl.JMSBridgeImpl">
     <!-- HornetQ must be started before the bridge -->
     <depends>HornetQServer</depends>
     <constructor>
         <!-- Source ConnectionFactory Factory -->
         <parameter>
             <inject bean="SourceCFF"/>
         </parameter>
         <!-- Target ConnectionFactory Factory -->
         <parameter>
             <inject bean="TargetCFF"/>
         </parameter>
         <!-- Source DestinationFactory -->
         <parameter>
             <inject bean="SourceDestinationFactory"/>
         </parameter>
         <!-- Target DestinationFactory -->
         <parameter>
             <inject bean="TargetDestinationFactory"/>
         </parameter>
         <!-- Source User Name (no user name here) -->
         <parameter><null /></parameter>
         <!-- Source Password (no password here)-->
         <parameter><null /></parameter>
         <!-- Target User Name (no user name here)-->
         <parameter><null /></parameter>
         <!-- Target Password (no password here)-->
         <parameter><null /></parameter>
         <!-- Selector -->
         <parameter><null /></parameter>
         <!-- Failure Retry Interval (in ms) -->
         <parameter>5000</parameter>
         <!-- Max Retries -->
         <parameter>10</parameter>
         <!-- Quality Of Service -->
         <parameter>ONCE_AND_ONLY_ONCE</parameter>
         <!-- Max Batch Size -->
         <parameter>1</parameter>
         <!-- Max Batch Time (-1 means infinite) -->
         <parameter>-1</parameter>
         <!-- Subscription name (no subscription name here)-->
         <parameter><null /></parameter>
         <!-- Client ID  (no client ID here)-->
         <parameter><null /></parameter>
         <!-- Add MessageID In Header -->
         <parameter>true</parameter>
         <!-- register the JMS Bridge in the AS MBeanServer -->
         <parameter>
             <inject bean="MBeanServer"/>
         </parameter>
         <parameter>org.hornetq:service=JMSBridge</parameter>
       </constructor>
     <property name="transactionManager">
         <inject bean="RealTransactionManager"/>
     </property>
  </bean>

  <!-- SourceCFF describes the ConnectionFactory used to connect to the 
      source destination -->
  <bean name="SourceCFF" 
      class="org.hornetq.api.jms.bridge.impl.JNDIConnectionFactoryFactory">
     <constructor>
         <parameter>
             <inject bean="JNDI" />
         </parameter>
         <parameter>/ConnectionFactory</parameter>
     </constructor>  
  </bean>

  <!-- TargetCFF describes the ConnectionFactory used to connect to the 
  target destination -->
  <bean name="TargetCFF" 
      class="org.hornetq.api.jms.bridge.impl.JNDIConnectionFactoryFactory">
     <constructor>
         <parameter>
             <inject bean="JNDI" />
         </parameter>
         <parameter>/ConnectionFactory</parameter>
     </constructor>  
  </bean>

  <!-- SourceDestinationFactory describes the Destination used as the source -->
  <bean name="SourceDestinationFactory" 
      class="org.hornetq.api.jms.bridge.impl.JNDIDestinationFactory">
     <constructor>
         <parameter>
             <inject bean="JNDI" />
         </parameter>
         <parameter>/queue/source</parameter>
     </constructor>  
  </bean>

  <!-- TargetDestinationFactory describes the Destination used as the target -->
  <bean name="TargetDestinationFactory" 
      class="org.hornetq.api.jms.bridge.impl.JNDIDestinationFactory">
     <constructor>
         <parameter>
             <inject bean="JNDI" />
         </parameter>
         <parameter>/queue/target</parameter>
     </constructor>  
  </bean>

  <!-- JNDI is a Hashtable containing the JNDI properties required -->
  <!-- to connect to the sources and targets JMS resources         -->       
  <bean name="JNDI" class="java.util.Hashtable">
   <constructor class="java.util.Map">
      <map class="java.util.Hashtable" keyClass="String"
                                       valueClass="String">
         <entry>
            <key>java.naming.factory.initial</key>
            <value>org.jnp.interfaces.NamingContextFactory</value>
         </entry>
         <entry>
            <key>java.naming.provider.url</key>
            <value>jnp://localhost:1099</value>
         </entry>
         <entry>
            <key>java.naming.factory.url.pkgs</key>
            <value>org.jboss.naming:org.jnp.interfaces"</value>
         </entry>
      </map>
   </constructor>
  </bean>

  <bean name="MBeanServer" class="javax.management.MBeanServer">
   <constructor factoryClass="org.jboss.mx.util.MBeanServerLocator"
                factoryMethod="locateJBoss"/>
  </bean>
</deployment>

31.1. JMS ブリッジパラメーター

例31.1「jms-bridge-jboss-beans.xml サンプル設定」 で示された JMSBridge Bean は、特定の順序でコンストラクターに渡されるパラメーターを介して設定されます。この順序と各パラメーターの説明は以下のリストで示されています。

注記

パラメーターを未指定のままにする場合 (たとえば、認証が匿名である場合や、メッセージセレクターが提供されない場合) は、未指定のパラメーター値に対して <null /> を使用します。
Source Connection Factory Factory
jms-bridge-jboss-beans.xml ファイルで定義された SourceCFF Bean を挿入します (ConnectionFactory が作成されます)。
Target Connection Factory Factory
jms-bridge-jboss-beans.xml ファイルで定義された TargetCFF Bean を挿入します (ターゲット ConnectionFactory が作成されます)。
Source Destination Factory Factory
jms-bridge-jboss-beans.xml ファイルで定義された SourceDestinationFactory Bean を挿入します (ソース Destination が作成されます)。
Target Destination Factory Factory
jms-bridge-jboss-beans.xml ファイルで定義された TargetDestinationFactory Bean を挿入します (ターゲット Destination が作成されます)。
Source User Name
ソース接続を作成するために使用するユーザー名を定義します。
Source Password
ソース接続を作成するために使用するユーザー名のパスワードを定義します。
Target User Name
ターゲット接続を作成するために使用するユーザー名を定義します。
Target Password
ターゲット接続を作成するために使用するユーザー名のパスワードを定義します。
Selector
ソース宛先からメッセージを消費する場合に使用される JMS セレクター表現を指定します。セレクター表現に一致するメッセージのみがソース宛先からターゲット宛先にブリッジされます。セレクター表現は、JMS セレクター構文に従う必要があります。
Failure Retry Interval
ブリッジが接続障害を検出したときにソースサーバーまたはターゲットサーバーへの接続を再作成しようとするときにその試行間で待機する時間 (ミリ秒単位) を指定します。
Max Retries
ブリッジが接続障害を検出したときにソースまたはターゲットサーバーに対する接続を再作成しようとする回数を指定します。この回数後にブリッジは再接続の試行を止めます。-1 は、「永久的な試行」を意味します。
Quality of Service
サービスモードの品質を定義します。可能な値は次のとおりです。
  • AT_MOST_ONCE
  • DUPLICATES_OK
  • ONCE_AND_ONLY_ONCE
これらのモードについては、「サービス品質モード」 を参照してください。
Max Batch Size
ターゲット宛先にメッセージをバッチで送信する前にソース接続から消費する必要があるメッセージの最大数を定義します。この値は 1 以上である必要があります。
Max Batch Time
消費されるメッセージの数が MaxBatchSize に到達しない場合であっても、ターゲット宛先にバッチを送信するまで待機する時間 (ミリ秒単位) を定義します。この値は 1 以上または -1 (「永久的に待機」を指定する場合) である必要があります。
Subscription Name
ソース宛先がトピックであり、耐性サブスクリプションを持つトピックから消費する場合、このパラメーターは耐性サブスクリプション名を定義します。
Client ID
ソース宛先がトピックであり、耐性サブスクリプションを持つトピックから消費する場合、耐性サブスクリプションを作成またはルックアップするときにこのパラメーターは使用する JMS クライアント ID を定義します。
Add MessageID In Header
true の場合、元のメッセージのメッセージ ID が、HORNETQ_BRIDGE_MSG_ID_LIST ヘッダーの宛先に送信されるメッセージに付加されます。メッセージが複数回ブリッジ接続された場合は、各メッセージ ID が付加されます。これにより、分散応答パターンを使用できるようになります。

注記

メッセージが受信された場合は、最初のメッセージ ID の相関 ID を使用して応答を送信できるため、元の送信者が応答を受け取ると、メッセージを関連付けることができます。
MBean Server
JMS ブリッジを JMX で管理するために、これを JMS ブリッジが登録された場所 (アプリケーションサーバー MBeanServer) に設定します。
ObjectName
MBeanServer が設定された場合は、JMS Bridge MBean を登録するために使用する名前を定義するためにこのパラメーターを設定する必要があります。この名前は一意である必要があります。