1. 什么是連接器
在ActiveMQ中有3個重要的角色:Broker、Producer、Consumer。
Broker為消息代理,它是ActiveMQ服務(wù)端角色,接受客戶端的連接并提供消息通信的核心服務(wù)。
Producer是消息生產(chǎn)者,客戶端角色。
Consumer是消息消費者,客戶端角色。
客戶端怎樣和服務(wù)端通信,該選擇哪種網(wǎng)絡(luò)協(xié)議?ActiveMQ定義的連接器(connector)就是用來約定ActiveMQ的節(jié)點之間如何通信。
2. 連接器分類
在ActiveMQ中,連接器(connector)共分為以下兩類:
- 傳輸連接器(
transport connector):用于客戶端和服務(wù)端之間( client-to-broker)的通信。 - 網(wǎng)絡(luò)連接器(
network connector):用戶集群中多個服務(wù)端之間(broker-to-broker)的通信。
2.1 傳輸連接器
傳輸連接器提供了很多連接協(xié)議供使用者來選擇,ActiveMQ 的5.15版本包括以下協(xié)議:
- tcp,默認使用的協(xié)議,符合大多數(shù)的使用場景。
- udp,客戶端使用udp協(xié)議和服務(wù)端通信,當(dāng)客戶端和服務(wù)端之間存在防火墻可以考慮使用udp協(xié)議。
- vm,當(dāng)客戶端和服務(wù)端在同一個JVM中可以考慮使用。直接使用虛擬機本地方法調(diào)用,從而避免網(wǎng)絡(luò)通信的開銷。
- nio,本質(zhì)上還是tcp,只是使用了java NIO包,某些場景下可能性能更好。
- ssl,基于tcp提供安全的通信。
- http/https,允許客戶端使用REST或Ajax的方式進行連接,可以通過JS給ActiveMQ發(fā)送消息。
- multicast,客戶端使用組播的方式連接到服務(wù)端。
- websocket,可以通過HTML5中的websocket技術(shù)連接服務(wù)端。
- amqp,高級消息隊列協(xié)議,很多消息中間件都支持該協(xié)議。ActiveMQ5.8版本開始支持。
- mqtt,MQTT是一個基于客戶端-服務(wù)器的消息發(fā)布/訂閱傳輸協(xié)議,主要應(yīng)用在loT(物聯(lián)網(wǎng))。
- stomp,STOMP是在WebSocket之上提供了一個基于幀的線路格式(frame-based wire format)層,用來定義消息的語義,就像HTTP在TCP套接字之上添加了請求-響應(yīng)模型層一樣。ActiveMQ5.6版本開始支持
用戶可以根據(jù)自己應(yīng)用的特點來選擇不同的協(xié)議。上面介紹的是客戶端和服務(wù)端之間通信的一些基本協(xié)議,除了這些基本協(xié)議之外,ActiveMQ還提供了客戶端和服務(wù)器端通信高可用的配置。
- failover,為客戶端提供重連服務(wù)端的邏輯,允許配置多個上面介紹的不同協(xié)議的連接配置,并隨機的從其中選擇一個進行連接,如果失敗則繼續(xù)選擇其他服務(wù)重試。failover的配置格式:
failover:(tcp://ip1:61616,tcp://ip2:61616)?initialReconnectDelay=100。 - fanout,采用復(fù)制的方式將消息發(fā)送給多個服務(wù)端,配置格式為:
fanout:(tcp://localhost:61629,udp://localhost:61639,tcp://localhost:61649)
fanout
2.2 網(wǎng)絡(luò)連接器
網(wǎng)絡(luò)連接器用來將多個消息服務(wù)器連接在一起形成集群,作為一個整體對外提供服務(wù)。

ActiveMQ中的網(wǎng)絡(luò)連接器,常用的有如下兩種:
- static,靜態(tài)協(xié)議,用于已知多個服務(wù)器的IP地址。
- multicast,廣播協(xié)議,用于服務(wù)器之間實現(xiàn)動態(tài)識別。
3. 連接器的配置及使用
服務(wù)端的連接器配置可以配置在ActiveMQ的配置文件%ActiveMQ_home%\conf\activemq.xml中(當(dāng)然ActiveMQ啟動時,可以指定配置文件)。在activemq.xml文件中,可以看到如下配置:
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
這段配置的含義是,這個ActiveMQ服務(wù)對外提供tcp\amqp\stomp\ws\mqtt協(xié)議,以便客戶端連接。
以TCP為例,可以看到配置語法都是形如:
tcp://hostname:port?key=value
具體各個協(xié)議具體怎么配置、支持哪些參數(shù)請參考官方文檔:
URI Protocols
Configuring Transports
指定單獨的配置文件
ActiveMQ服務(wù)默認的配置文件為:%ActiveMQ_home%\conf\activemq.xml。我們可以根據(jù)應(yīng)用的需求對此默認的配置文件進行修改,有時我們不想改動此文件,而是指定另外一個單獨的文件作為ActiveMQ的配置。針對這種情況,ActiveMQ提供了xbean支持,具體用法如下所示:
activemq start xbean:examples/conf/myactivemq.xml
xbean支持相對路徑和絕對路徑,下面的演示環(huán)境是windows cmd
1.相對路徑
D:\app\apache-activemq-5.15.8\bin> activemq start xbean:../examples/conf/activemq.xml
2.絕對路徑
D:\app\apache-activemq-5.15.8\bin> activemq start xbean:/D:/app/apache-activemq-5.15.8/examples/conf/activemq-demo.xml
客戶端指定連接協(xié)議
那么客戶端如何指定連接的協(xié)議呢?可以在創(chuàng)建ConnectionFactory對象時,指定使用什么協(xié)議和消息服務(wù)端進行通信。如下所示:
String brokerURL = "tcp://localhost:61616";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);
和服務(wù)端一樣,客戶端也支持在url后面帶一些參數(shù),用來配置屬性。
參考資料/擴展閱讀
[1]:深入理解AMQP協(xié)議
[2]:《ActiveMQ In Action》
[3]:消息隊列之 ActiveMQ
[4]:Networks of Brokers
