4

(11.11.11に編集、下部に編集)

HornetQ (バージョン 2.2.5 AS7) サーバーを実行する 2 つの JBoss AS 6.1 サーバーがあります。もう 1 つは CLIENT、もう 1 つは MASTER と呼びましょう。

CLIENT にはキュー (「sourceQueue」) があり、Web アプリケーションによって書き込まれます。

CLIENT サーバーと MASTER サーバーの間に設定された JMS ブリッジがあり、CLIENT の sourceQueue からのメッセージを消費し、MASTER の targetQueue でメッセージを生成する必要があります。ブリッジは CLIENT JBoss で実行されています。

問題: ソースから消費してターゲットでメッセージを生成する代わりに、表面的には何も起こらないように見えます: ソースには 1 つのメッセージがあり、ターゲットにはメッセージがありません。ソースにそのメッセージが何度も供給されている可能性もあります。

netty コネクタを使用したネットワーク接続は機能しています。これは、ブリッジを再起動し、netstat -n -c の出力を観察してテストされています。

どのような問題がこの種の問題を引き起こす可能性がありますか?

  • ネットワークの問題?
  • トランザクションマネージャー?
  • コネクターエラー?

HornetQ ブリッジの問題をどのように診断しますか?

以下は、hornetq-jboss-beans.xml (CLIENT /jboss/server/default/deploy/hornetq ) のブリッジ定義です。定義は、 HornetQ マニュアルの JMS ブリッジの例に近いバリエーションです。

   <bean name="JMSBridge" class="org.hornetq.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 username here) -->
               <parameter><null /></parameter>
               <!-- Source Password (no password here)-->
               <parameter><null /></parameter>
               <!-- Target User Name (no username 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=MyJMSBridge</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.jms.bridge.impl.JNDIConnectionFactoryFactory">
           <constructor>
               <parameter>
                   <inject bean="sourceJNDI" />
               </parameter>
               <parameter>/XAConnectionFactory</parameter>
           </constructor>
       </bean>

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

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

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

       <!-- JNDI is a Hashtable containing the JNDI properties required -->
       <!-- to connect to the sources and targets JMS resrouces         -->
      <bean name="sourceJNDI" class="java.util.Hashtable">
         <constructor class="java.util.Map">
            <map class="java.util.Hashtable" keyClass="java.lang.String"
                                             valueClass="java.lang.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>
               <entry>
                  <key>jnp.timeout</key>
                  <value>5000</value>
               </entry>
               <entry>
                  <key>jnp.sotimeout</key>
                  <value>5000</value>
               </entry>
            </map>
         </constructor>
      </bean>
      <bean name="targetJNDI" class="java.util.Hashtable">
         <constructor class="java.util.Map">
            <map class="java.util.Hashtable" keyClass="java.lang.String"
                                             valueClass="java.lang.String">
               <entry>
                  <key>java.naming.factory.initial</key>
                  <value>org.jnp.interfaces.NamingContextFactory</value>
               </entry>
               <entry>
                  <key>java.naming.provider.url</key>
                  <value>jnp://TARGET-URL.example.com:1099</value>
               </entry>
               <entry>
                  <key>java.naming.factory.url.pkgs</key>
                  <value>org.jboss.naming:org.jnp.interfaces"</value>
               </entry>
               <entry>
                  <key>jnp.timeout</key>
                  <value>5000</value>
               </entry>
               <entry>
                  <key>jnp.sotimeout</key>
                  <value>5000</value>
               </entry>
            </map>
         </constructor>
      </bean>

CLIENT 側の hornetq-jms.xml のキュー定義:

<configuration xmlns="urn:hornetq"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">

   <connection-factory name="NettyConnectionFactory">
      <connectors>
         <connector-ref connector-name="netty"/>
      </connectors>
      <entries>
         <entry name="/ConnectionFactory"/>
         <entry name="/XAConnectionFactory"/>
      </entries>
      <xa>true</xa>
   </connection-factory>

   <queue name="DLQ">
      <entry name="/queue/DLQ"/>
   </queue>

   <queue name="ExpiryQueue">
      <entry name="/queue/ExpiryQueue"/>
   </queue>

   <queue name="notificationQueue">
      <entry name="/jms/notificationRequestQueue"/>
   </queue>
</configuration>

MASTER 側の hornetq-jms.xml:

<configuration xmlns="urn:hornetq"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="urn:hornetq /schema/hornetq-jms.xsd">

   <connection-factory name="NettyConnectionFactory">
      <connectors>
         <connector-ref connector-name="netty"/>
      </connectors>
      <entries>
         <entry name="/ConnectionFactory"/>
         <entry name="/XAConnectionFactory"/>
      </entries>
      <xa>true</xa>
   </connection-factory>
   <connection-factory name="NettyRemoteConnectionFactory">
      <connectors>
         <connector-ref connector-name="netty-remote"/>
      </connectors>
      <entries>
         <entry name="/integration/XAConnectionFactory"/>
      </entries>
      <xa>true</xa>
   </connection-factory>

   <queue name="DLQ">
      <entry name="/queue/DLQ"/>
   </queue>

   <queue name="ExpiryQueue">
      <entry name="/queue/ExpiryQueue"/>
   </queue>

   <queue name="targetQueue">
      <entry name="/integration/jms/notificationRequestQueue"/>
   </queue>

    <topic name="unrelatedTopic">
        <entry name="/topic/cacheFlushNotification"/>
    </topic>
</configuration>

編集: 何らかの理由で、両方のサーバーが完全にデプロイされた後にブリッジを停止して再起動すると、ブリッジはメッセージの転送を開始します。これは手動のプロセスであり、ハックを使用してブリッジを定期的に再起動するのは嫌いです。この問題に対する提案を歓迎します。

また、ブリッジが読み取り元のキューに依存するようにすることで、起動シーケンスを改善しました。そうしないと、ブリッジがキューの前に起動され、エラーがログに記録されます。

4

2 に答える 2

2

この投稿を確認してください: https://issues.jboss.org/browse/HORNETQ-247 コア キューを公開し、コア ブリッジで使用する方法についての洞察が得られます。

于 2011-12-20T14:31:52.597 に答える
0

コアブリッジを使用しないのはなぜですか?

于 2011-11-11T17:29:55.643 に答える