我正在尝试使用hornetq核心API来定义hornetq客户端,而将使用弹簧来定义HA。 但是当我停止实时服务器并且备份服务器变为“活动”时,客户端会因连接错误而失败。知道我做错了吗?
我定义了集群独立的hornetq服务器(没有组或发现)。 hornetq-configuration.xml文件:
...
<connectors>
<connector name="netty">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
<param key="host" value="${hornetq.remoting.netty.host:live-host}"/>
<param key="port" value="${hornetq.remoting.netty.port:5445}"/>
</connector>
<!-- Connector to this server.s backup. This is needed for failback to work properly in a static cluster -->
<connector name="netty-backup">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
<param key="host" value="${hornetq.remoting.netty.host:backup-host}"/>
<param key="port" value="${hornetq.remoting.netty.port:5446}"/>
</connector>
<cluster-connections>
<cluster-connection name="my-cluster">
<address>jms</address>
<connector-ref>netty</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<forward-when-no-consumers>false</forward-when-no-consumers>
<max-hops>1</max-hops>
<static-connectors>
<!-- Without this the connection factory won.t be able to reconnect on failback -->
<connector-ref>netty-backup</connector-ref>
</static-connectors>
</cluster-connection>
...
我定义了hornetq客户端:
@Test
public void testHA() throws InterruptedException, IOException{
List<TransportConfiguration> transportConfigurationList = new ArrayList<TransportConfiguration>();
Map<String, Object> transportProperties = new HashMap<String, Object>();
transportProperties.put("host", "live-server");
transportProperties.put("port", 5445);
transportConfigurationList.add(new TransportConfiguration("org.hornetq.core.remoting.impl.netty.NettyConnectorFactory", transportProperties));
transportProperties = new HashMap<String, Object>();
transportProperties.put("host", "backup-server");
transportProperties.put("port", 5446);
transportConfigurationList.add(new TransportConfiguration("org.hornetq.core.remoting.impl.netty.NettyConnectorFactory", transportProperties));
HornetQJMSConnectionFactory connectionFactory = new HornetQJMSConnectionFactory(true, transportConfigurationList.toArray(new TransportConfiguration[2]));
JmsTemplate producer = new JmsTemplate(connectionFactory);
producer.send(new HornetQTopic("deploy"), new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage txtMessage = session.createTextMessage("my message");
return txtMessage;
}
});
System.out.println("Stop live server");
System.in.read();
producer.send(new HornetQTopic("deploy"), new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage txtMessage = session.createTextMessage("my message");
return txtMessage;
}
});
Thread.sleep(60000);
}
输出:
Stop live server
Apr 30, 2012 5:08:32 PM org.hornetq.core.logging.impl.JULLogDelegate warn
WARNING: Tried 1 times to connect. Now giving up on reconnecting it.
另外,实时服务器有日志错误:
答案 0 :(得分:1)
我发现如何创建使用HA的hornetq客户端,但它需要我使用JNDI并通过查找获得连接工厂。 我确实喜欢这个:
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.provider.url">jnp://jndi-host:jndi-port</prop>
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
</props>
</property>
</bean>
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate" ref="jndiTemplate" />
<property name="jndiName" value="ConnectionFactory" />
</bean>
有没有办法在没有JNDI的情况下创建这样的客户端?
答案 1 :(得分:0)
spring config将HornetQ故障转移设置为备份服务器
<bean id="hornetQConnectionFactory" class="org.hornetq.jms.client.HornetQJMSConnectionFactory">
<constructor-arg index="0" name="ha" value="true" />
<constructor-arg index="1">
<list>
<bean class="org.hornetq.api.core.TransportConfiguration">
<constructor-arg value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory" />
<constructor-arg>
<map key-type="java.lang.String"
value-type="java.lang.Object">
<entry key="host" value="Q-server-1"></entry>
<entry key="port" value="5445"></entry>
</map>
</constructor-arg>
</bean>
<bean class="org.hornetq.api.core.TransportConfiguration">
<constructor-arg value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory" />
<constructor-arg>
<map key-type="java.lang.String"
value-type="java.lang.Object">
<entry key="host" value="Q-server2"></entry>
<entry key="port" value="5446"></entry>
</map>
</constructor-arg>
</bean>
</list>
</constructor-arg>
</bean>
Q1是主要的,Q2被设置为备份。 适用于HornetQ hornetq-2.4.0.Final独立安装,以及hornetq-jms-client版本的客户端:2.4.5.Final