HornetQ:当服务器充当备份时,无法使用连接工厂

时间:2014-02-19 18:56:49

标签: jboss jms jboss7.x hornetq

我有一个在NAS上共享商店的实时备份HornetQ 2服务器群集,我有来自外部的应用程序连接到群集,我可以看到一切正常:当实时服务器停机并且备份以实时启动,我的应用程序正在切换到这个新的服务器没有任何问题。

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。

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

2 个答案:

答案 0 :(得分:0)

我有类似的架构两个客户端(jboss)和HornetQ集群(2xlive,2xbackup)biuld使用独立的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来监听拓扑并回收Spring MessageListenerContainers:

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

   void nodeDown(long eventUID, String nodeID);
     }

答案 1 :(得分:0)

当您通过将<backup>true</backup>添加到其他配置来配置hornetq服务器作为备份时,该服务器不会创建工厂,队列,并且您无法部署JMS组件。 尝试保留所有其他配置,然后更改<backup>false</backup>

hornetq manual: high availability section