【问题标题】:HornetQ JMS Bridge between two HornetQ servers fails to deliver两个 HornetQ 服务器之间的 HornetQ JMS 桥无法交付
【发布时间】:2011-12-21 04:34:55
【问题描述】:

(于 11.11.11 编辑,在底部编辑)

我有两台运行 HornetQ(版本 2.2.5 AS7)服务器的 JBoss AS 6.1 服务器。 让我们调用另一个 CLIENT 和另一个 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 manual 上 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>

编辑: 出于某种原因,如果我在两个服务器都完全部署后停止并重新启动桥接器,桥接器就会开始传输消息。这是一个手动过程,我讨厌使用 hack 定期重启网桥。我欢迎对此问题提出任何建议。

我还通过使网桥依赖于它读取的队列来改进启动顺序 - 否则网桥会在队列之前启动,从而导致错误记录。

【问题讨论】:

  • 请用您的核心队列配置示例以及您声明核心网桥和核心队列之间依赖关系的方式发布答案。提前致谢
  • 要让 JMS Bridge 在 JMS Server 准备好之后启动,将 JMSServerManager 放在 JMSBridge bean 定义的 之前,根据 hornetq 示例( jms/jms-bridge)

标签: jms jboss6.x hornetq


【解决方案1】:

为什么不使用核心网桥?

【讨论】:

  • 使用核心网桥需要使用核心队列,并且它们必须在网桥之前存在。我不知道如何将核心队列公开为 JMS 队列,HornetQ 论坛上的响应似乎也不鼓励该解决方案。如果您对此有解决方案,我会非常乐意使用核心网桥。
  • 这个问题现在已经用 JMS 桥解决了。后来我遇到了一个似乎可以解决这个问题的技巧。与命名约定有关:核心队列获得您给它们的确切名称。 JMS 队列有“jms.queue”。在你给他们的名字前面。为了使用带有 JMS 访问队列的核心网桥,您需要按名称“jms.queue.QUEUENAME”引用核心队列,而在 jms 配置中您引用“QUEUENAME”。这尚未经过测试,但看起来可能会起作用。
【解决方案2】:

查看这篇文章: https://issues.jboss.org/browse/HORNETQ-247 它提供了一些关于如何公开核心队列并在核心桥中使用它们的见解。

【讨论】:

    猜你喜欢
    • 2013-07-11
    • 2013-04-01
    • 1970-01-01
    • 2015-08-03
    • 2021-09-08
    • 2012-10-29
    • 2023-03-08
    • 2013-09-20
    • 1970-01-01
    相关资源
    最近更新 更多