ActiveMQ叢集搭建好之後,接下來就該測試一下了。
一、先安裝Zookeeper 的eclipse插件吧。
1. 打開 eclipse, Help -》 Install New Software,點選Add,添加位址: http://www.massedynamic.org/eclipse/updates/

2. 點選OK,勾選Zookeeper插件,另外兩個貌似沒用
3. 安裝完之後,點選Window-》Show View-》Other,選擇安裝的Zookeeper插件
4. 出現Zookeeper控制台後,點選右上角的按鈕,增加Zookeeper節點。
出現界面
點選Add
添加你的Zookeeper IP,Finish
5. 檢視叢集資訊。
如果你的Zookeeper+ActiveMQ開啟的話,會出現
二、代碼
一個簡單的生産者:
package mq.cluster;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Sender {
public static void main(String[] args) throws Exception {
//1. 建立一個ConnectionFactory. 預設tcp://0.0.0.0:61616
String userName = ActiveMQConnectionFactory.DEFAULT_USER;
String password = ActiveMQConnectionFactory.DEFAULT_PASSWORD;
String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerURL);
//2. 通過ConnectionFactory建立一個Connection連接配接,并且調用start方法開啟
Connection connection = connectionFactory.createConnection();
connection.start();
//3. 通過Connection建立Session,用于接收消息[第一個參數:是否啟用事務;第二個參數:設定簽收模式]
// Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);//手工簽收--常用
//4. 通過Session建立Destination對象
Destination destination = session.createQueue("foodQueue");
//5. 通過Session建立發送或接受對象
MessageProducer messageProducer = session.createProducer(null);
//7. 使用JMS規範裡面消息類型之一 TextMessage 來建立資料,用MessageProducer來發送
for (int i = 1; i < 500; i++) {
TextMessage message = session.createTextMessage();
message.setText("大蘿蔔" + i);
//參數:目标,消息,傳遞資料的模式,優先級,消息的過期時間
messageProducer.send(destination, message, DeliveryMode.NON_PERSISTENT, 0, 1000*60);
//System.out.println("生産者:" + message.getText());
Thread.sleep(1000);
}
//使用事務要手動送出
//session.commit();
//8. 關閉連接配接
connection.close();
}// main
}
因為是叢集,是以brokerUrl要與衆不同,
String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";
一個簡單的消費者:
package mq.cluster;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
public class Receiver {
public static void main(String[] args) throws Exception {
//1. 建立一個ConnectionFactory. tcp://0.0.0.0:61616
String userName = ActiveMQConnectionFactory.DEFAULT_USER;
String password = ActiveMQConnectionFactory.DEFAULT_PASSWORD;
String brokerURL = "failover:(tcp://192.168.127.129:61616,tcp://192.168.127.130:61616,tcp://192.168.127.131:61616)?Randomize=false";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(userName, password, brokerURL);
//2. 通過ConnectionFactory建立一個Connection連接配接,并且調用start方法開啟
Connection connection = connectionFactory.createConnection();
connection.start();
//3. 通過Connection建立Session,用于接收消息[第一個參數:是否啟用事務;第二個參數:設定簽收模式]
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//4. 通過Session建立Destination對象
Destination destination = session.createQueue("foodQueue");
//5. 通過Session建立發送或接受對象
MessageConsumer messageConsumer = session.createConsumer(destination);
//7. 使用JMS規範裡面消息類型之一 TextMessage 來建立資料
while (true) {
TextMessage message = (TextMessage) messageConsumer.receive();
if(message == null) break;
System.out.println("消費者:" + message.getText());
}
//8. 關閉連接配接
connection.close();
}// main
}
先開啟消費者,讓它先阻塞,準備吃飯。然後開啟生産者:
浏覽器打開提供服務的MQ控制台
一切正常
三、關于負載均衡
畫個圖先~僅供參考【這部分真的僅供參考啊!!别噴我,但是可以告訴我怎樣是對的
,希望大家指正】
目前的架構:
負載均衡方案:=========================================
第二種方案呢,假設我們整個應用是個食堂,這個食堂裡面有好多飯口,每個飯口有好多大爺大媽(咦~~~)。每個飯口實作了高可用,即使有大媽不上班,還有大爺頂上。針對好多學生(使用者),實作了負載均衡,學生被基本均勻的配置設定到每一個飯口上。
食堂----應用
飯口----叢集
大媽----伺服器
==================================
現在我們利用Broker-Cluster 可以解實作負載均衡。配置的方法就是:
打開activemq.xml檔案,在persistenceAdapter的前面加上
|
就拿這兩個叢集來說:
叢集1 >>>>>>>>連結>>>>>>>> 叢集2:192.168.127.1,192.168.127.2,192.168.127.3 加上
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.127.4:61616,tcp://192.168.127.5:61616,tcp://192.168.127.6:61616)" duplex="false"/>
</networkConnectors>
叢集2 >>>>>>>>連結>>>>>>>> 叢集1: 192.168.127.4,192.168.127.5,192.168.127.6 加上
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.127.1:61616,tcp://192.168.127.2:61616,tcp://192.168.127.3:61616)" duplex="false"/>
</networkConnectors>
說白了就是把對方的位址拿過來
如果是三個叢集呢?
那麼就多加一個<networkConnector uri="tcp://..."/>
比如多了一個叢集3(IP:192.168.127.7,192.168.127.8,192.168.127.9)
叢集1 >>>>>>>>連結>>>>>>>> 叢集2&叢集3:192.168.127.1,192.168.127.2,192.168.127.3 加上
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.127.4:61616,tcp://192.168.127.5:61616,tcp://192.168.127.6:61616)" duplex="false"/>
<networkConnector uri="static:(tcp://192.168.127.7:61616,tcp://192.168.127.8:61616,tcp://192.168.127.9:61616)" duplex="false"/>
</networkConnectors>
叢集2 >>>>>>>>連結>>>>>>>> 叢集1&叢集3 和 叢集3 >>>>>>>>連結>>>>>>>> 叢集1&叢集2 照葫蘆畫瓢
最後還是要說一句:僅供參考啊!!!!!
小LUA
面對敵人的嚴刑逼供,我一個字也沒說,而是一五一十寫了下來。