【问题标题】:HornetQ: Cannot use connection factory when the server is acting as a backupHornetQ:当服务器作为备份时不能使用连接工厂
【发布时间】:2014-03-20 07:56:14
【问题描述】:

我有实时备份 HornetQ 2 服务器集群在 NAS 上共享一个存储,我有来自外部的应用程序连接到集群,我可以看到一切正常:当实时服务器出现故障并且备份作为实时服务器启动时,我的应用程序正在毫无问题地切换到这个新服务器。

HornetQ 用作 JBoss AS 7 服务器的一部分,我也有其他应用程序连接到 HornetQ 集群,它们使用与集群外部其他应用程序相同的连接工厂,这是使用的连接工厂:

<jms-connection-factories>
    <connection-factory name="hornetq">
        <connectors>
            <connector-ref connector-name="node1-live"/>
            <connector-ref connector-name="node2-backup"/>
        </connectors>
        <entries>
            <entry name="java:/jms/ConnectionFactory"/>
            <entry name="java:jboss/exported/jms/ConnectionFactory"/>
        </entries>
    </connection-factory>
</jms-connection-factories>

这是我的连接器定义:

<connectors>
    <netty-connector name="netty" socket-binding="messaging"/>
    <in-vm-connector name="in-vm" server-id="0"/>
    <connector name="node1-live">
        <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
        <param key="host" value="10.10.10.1"/>
        <param key="port" value="5445"/>
        <param key="use-nio" value="true"/>
    </connector>
    <connector name="node2-backup">
        <factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
        <param key="host" value="10.10.10.2"/>
        <param key="port" value="5445"/>
        <param key="use-nio" value="true"/>
    </connector>
</connectors>

我遇到的问题是没有 node2(备份节点),似乎当它作为备份运行时,HornetQ 消息传递子系统没有加载,因此,工厂和连接器没有暴露给 node2 上托管的应用程序JBoss AS。

我正在寻找一种方法将工厂和连接器公开给备份节点上的应用程序,以便连接到实时服务器。

【问题讨论】:

    标签: jboss jms jboss7.x hornetq


    【解决方案1】:

    我有类似的架构,两个客户端(jboss)和 HornetQ 集群(2xlive,2xbackup)使用独立的 HornetQ。

    起初我们尝试按照您描述的方式进行连接,但通过异常测试始终无法正常。

    解决方案是: 在 hornetq (hornetq-configuration.xml) 上设置发现组:

      <discovery-groups>
         <discovery-group name="dg-group1">
            <group-address>231.7.7.7</group-address>
            <group-port>9876</group-port>
            <refresh-timeout>10000</refresh-timeout>
         </discovery-group>
      </discovery-groups>
    

    然后在客户端(我们使用spring)定义discoveryGroupConfig:

     <bean id="discoveryGroupConfig" class="org.hornetq.api.core.DiscoveryGroupConfiguration">
        <constructor-arg name="groupAddress" value="231.7.7.7" />
        <constructor-arg name="groupPort" value="9876" />
        <property name="discoveryInitialWaitTimeout" value="10000"/>
    </bean>
    

    工厂:

     <bean id="producerDiscoveryConnFactory" class="org.hornetq.jms.client.HornetQXAConnectionFactory">
        <constructor-arg value="true" />
        <constructor-arg ref="discoveryGroupConfig" />
    </bean>
    

    最后是缓存工厂:

    <bean id="cachingConnFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="producerDiscoveryConnFactory" />
        <property name="sessionCacheSize" value="200" />
        <property name="cacheProducers" value="true" />
    </bean>
    

    但是您应该知道:一旦创建,JMS 连接总是与集群中的给定节点绑定。所以需要通过实现接口org.hornetq.api.core.client.ClusterTopologyListener来监听topology,并回收spring MessageListenerContainers:

    public interface ClusterTopologyListener
     {
         void nodeUP(long eventUID, String nodeID,               Pair<TransportConfiguration, TransportConfiguration> connectorPair, boolean last);
    
       void nodeDown(long eventUID, String nodeID);
         }
    

    【讨论】:

      【解决方案2】:

      当您通过添加&lt;backup&gt;true&lt;/backup&gt; 和其他配置将hornetq 服务器配置为备份时,该服务器不会创建工厂、队列,并且您无法部署引用它的JMS 组件。 尝试保留所有其他配置并更改&lt;backup&gt;false&lt;/backup&gt;

      hornetq manual: high availability section

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2014-11-16
        • 2019-04-22
        • 1970-01-01
        相关资源
        最近更新 更多