我有一个在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。
我正在寻找一种方法,将工厂和连接器暴露给备份节点上的应用程序,以便连接到实时服务器。
答案 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>
。