Web管理控制檯 | 消息服務接口 | 集羣通信接口 | |
mq1 | 8161 | 51511 | 61601 |
mq2 | 8162 | 51512 | 61602 |
mq3 | 8163 | 51513 | 61603 |
1
|
<
broker
xmlns
=
"http://activemq.apache.org/schema/core"
brokerName
=
"V1MQ"
dataDirectory
=
"${activemq.data}"
>
|
二、配置levelDB,加載<broker>節點內html
bind:集羣間通信的ip和端口java
zkAddress:ZooKeeper地址,多個可用,逗號分隔git
hostname:主機名,可在/etc/hosts中進行配置github
zkPath:zkPath目錄,可在ZooInspetor中進行查看web
1
2
3
4
5
6
7
8
9
10
11
|
<
persistenceAdapter
>
<!-- kahaDB directory="${activemq.data}/kahadb"/ -->
<
replicatedLevelDB
directory
=
"${activemq.data}/leveldb"
replicas
=
"3"
zkAddress
=
"192.168.146.130:2181"
hostname
=
"V1"
zkPath
=
"/activemq/leveldb-stores"
/>
</
persistenceAdapter
>
|
四、啓動activemq數據庫
/usr/local/src/activemq1/bin/activemq startapache
可經過/usr/local/src/activemq1/data/activemq.log查看啓動日誌session
五、關於管控臺併發
雖然3個activemq都啓動了,可是同一時間只有Master對應的管控臺可用,Slaver對應的管控臺不可用異步
4、結合ZooInspector測試(推薦使用dubbokeeper中查看zookeeper的一個UI插件,https://github.com/dubboclub/dubbokeeper)
一、打開ZooInspector(可自行搜索下載或從羣中下載),輸入ZooKeeper地址進行監控,若是3個activemq都啓動成功,則顯示以下:
二、Java測試代碼
代碼可參考:http://www.cnblogs.com/gossip/p/5970090.html
a) 配置集羣IP(這裏3個activemq的端口分別是51511,51512,51513)
1
2
3
4
5
6
7
8
|
<!-- 配置JMS鏈接工廠 -->
<
bean
id
=
"connectionFactory"
class
=
"org.apache.activemq.ActiveMQConnectionFactory"
>
<
property
name
=
"brokerURL"
value
=
"failover:(tcp://192.168.146.129:51511,tcp://192.168.146.129:51512,tcp://192.168.146.129:51513)"
/>
<!--解決接收消息拋出異常:javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke-->
<
property
name
=
"trustAllPackages"
value
=
"true"
/>
<!-- 是否異步發送 -->
<
property
name
=
"useAsyncSend"
value
=
"true"
/>
</
bean
>
|
b) 測試代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
@Test
public
void
produceMsg_DefaultQueue() {
for
(
int
i =
0
; i <
10000
; i++) {
final
String msg =
"序號:"
+String.valueOf(i) +
" "
+
"這裏是向默認隊列發送的消息"
+
new
Date().toString();
System.out.println(msg);
String destination = jmsTemplate.getDefaultDestination().toString();
jmsTemplate.send(
new
MessageCreator() {
public
Message createMessage(Session session)
throws
JMSException {
return
session.createTextMessage(msg);
}
});
try
{
Thread.sleep(
300
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}
|
三、啓動Java程序併發送消息
四、關閉Master隊列(注意此時的Master隊列爲mq2)
a) 此時的ZooInspetor
五、重啓mq2隊列(重啓後mq2加入隊列成爲Slaver,可是mq1仍是Master,隊列不受影響)
六、關閉mq一、mq2,僅剩mq3(因爲只有一個隊列,沒法進行選舉,因此整個隊列都沒法提供服務)
七、重啓mq1(重啓mq1後,mq1和mq3選舉了Master隊列,從而從新對外提供服務)
a) ZooInspecto顯示mq1被選舉爲Master
b) 程序從新向隊列消息,數據並無中斷
5、總結
本文演示了activemq僞集羣的搭建過程及高可用的測試過程,經過觸類旁通能夠將activemq部署到不一樣的機器上,從而實現相同的功能。
遺留問題:ZooInspetor的activemq編號是自動生成的,很難發現其對應的隊列,請問有沒有能夠自定義編號的方法,謝謝。
6、參考資料
一、http://www.cnblogs.com/gossip/p/5970090.html
二、http://activemq.apache.org/replicated-leveldb-store.html