ActiveMQ容错链接测试
基于上一篇博客,环境利用的是上一节的,如果没有搭建的话,可以参考上一篇
如果连接的Broker挂掉了,那么Client可以采取两种策略来解决遇到的这个问题。
1.尝试连接集群中的其他节点
2.直接退出返回
那么此次测试的FailOver就是属于第一种。
话不多说,直接启动上一篇博文的环境。然后上代码:
package com.burgess.net;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 容错链接测试代码
* 创建人 BurgessLee
* 创建时间 2020/5/30
* 描述
*/
public class FailOverTest {
public static void main(String[] args) throws JMSException {
// randomize=true默认是随机分发的,如果指定为false,优先向指定的服务器发送消息
String url01="failover:(tcp://192.168.31.150:61616,tcp://192.168.31.150:61617)?randomize=true";
ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory(url01);
Connection conn =connFactory.createConnection();
conn.start();
Session session = conn.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
try {
Queue queue = session.createQueue("fail-over-queue");
MessageProducer producer = session.createProducer(queue);
for (int i = 0; i < 30; i++) {
TextMessage message = session.createTextMessage("message--" + i);
producer.send(message);
}
}catch(Exception e){
e.printStackTrace();
}finally{
session.commit();
session.close();
conn.close();
}
}
}
通过测试发现:
-
如果指定为true
-
如果两个节点都存在,会随意往任意一个节点发送消息
-
如果两个节点有一个挂掉了,那么会往另外一个里面发送消息
-
如果指定为false,优先向指定的服务器发送消息
消费者代码:
package com.burgess.net;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 容错测试消费端
* 创建人 BurgessLee
* 创建时间 2020/5/30
* 描述
*/
public class FailOverConsumerTest {
public static void main(String[] args) throws JMSException {
// randomize=true默认是随机分发的,如果指定为false,优先向指定的服务器发送消息
String url01="failover:(tcp://192.168.31.150:61616,tcp://192.168.31.150:61617)?randomize=true";
ActiveMQConnectionFactory connFactory = new ActiveMQConnectionFactory(url01);
Connection conn = connFactory.createConnection();
conn.start();
Session session = conn.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
try {
Queue queue = session.createQueue("fail-over-queue");
MessageConsumer consumer = session.createConsumer(queue);
for (int i = 0; i < 30; i++) {
Message message = consumer.receive();
String jmsType = message.getJMSType();
System.out.println("消息类型:"+jmsType);
TextMessage tx=(TextMessage)message;
session.commit();
System.out.println("收到消息:"+tx.getText());
//每个接收一次消息睡眠1秒
Thread.sleep(1000);
}
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
conn.close();
}
}
}
测试效果与生产者相同。
总结:链接方式使用failover链接集群,是ActiveMQ提供的容错链接的一种机制,保证当集群中有些节点挂掉之后,仍旧可以连接到其他节点。