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提供的容錯鏈接的一種機制,保證當集羣中有些節點掛掉之後,仍舊可以連接到其他節點。