JMS学习十 ActiveMQ支持的传输协议
JMS學習(ActiveMQ支持的傳輸協議)
ActiveMQ提供了一種連接機制,這種連接機制使用傳輸連接器(TransportConnector)實現客戶端與代理(client - to - broker)之間的通信。
網絡連接器(networkconnection)實現代理與代理之間的通信。(broker-to- broker);
一、TransportConnector支持的協議
ActiveMQ常用協議:
協議-描述-example
TCP-默認的協議性能相對來說還是可以的-tcp://host:port
NIO-基于TCP協議進行了擴展和優化,具有更好的擴展性-NIO://host:port
UDP-相比TCP性能更好,但是沒有tcp可靠-udp://host:port
SSL-安全連接-ssl://host:port
Http(s)-基于http或https的鏈接-http://host:port
注意使用ssl時要證書Http(s)要導入httpclient相關jar包
具體demo見官網:http://activemq.apache.org/uri-protocols.html
這些傳送協議都是在activemq.xml中配置的:
TCP: activemq.xml配置文件配置
?
<broker> ... <transportConnectors> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </<transportConnectors> ... </broker>?
TCP:客戶端代碼:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","tcp://127.0.0.1:61616");NIO:activemq.xml配置文件配置
<broker> ... <transportConnectors> <transportConnector name="nio" uri="nio://0.0.0.0:61616"/> </<transportConnectors> ... </broker>?
NIO:客戶端代碼:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","nio://127.0.0.1:61616");其他的也都一樣!!!
?
二、newworkConnector(網絡連接器)支持的協議
協議 描述 ?? ? example
Static ? ? ? ? 靜態協議 ? ? ? ? ? static://(tcp://ip:port)
Multicast ? ?多點傳送協議 ? ?uri="multicast://default"
這里先看兩種協議,但支持的協議不只這兩種。
1、靜態網絡連接器
靜態網絡連接器用于為一個網絡中多個代理創建靜態配置.這種配置協議使用了一種復合的URI--即包含其他URI的URI.?
靜態協議是broker to broker的連接。
靜態網絡連接器activemq.xml配置文件配置:可以和多個代理進行通信,進行數據的拉取。
<networkConnectors> <networkConnector name="local network" uri="static://(tcp://ip:61616,tcp://ip2:61616)"/> </networkConnectors>實例:
代理A的配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerA" dataDirectory="${activemq.data}"> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" /> </transportConnectors> </broker>代理B的配置
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.data}"> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61617" /> </transportConnectors> <networkConnectors> <networkConnector uri="static:(tcp://127.0.0.1:61616)" /> </networkConnectors> </broker>?
代理B中配置了和代理A的網絡連接,這樣配置后就能實現數據從B代理到A代理的流動,即使客戶端將消息發送到了B代理,但消息消費端訪問A代理也能獲取并消費發送到B代理的消息,這是因為他們之間配了網絡連接即networkConnection,當消費端來消費消息的時候,A代理從B代理哪里吧消息讀取過來在給訪問A代理的消費者。
2、動態網絡連接器
這種動態技術可以實現讓客戶端和代理之間,代理和代理之間實現動態識別,而不是配置靜態的IP組。?
多點傳送協議,代理會廣播自己的服務,也會定位其他代理。同理客戶端可以通過多點協議來接收廣播,識別出代理。
多址傳送協議的URI語法如下:?
multicast://ipadaddress:port?key=value?
?
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.data}"> <networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors> <transportConnectors> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/> </transportConnectors> </broker>?
?
在上面的例子中,使用群組名稱"default"來替代具體的IP地址.上面的配置代碼片段中有兩個地方比較重要.首先,transport connector的discoveryUri屬性用于暴露這個傳輸連接器的URI到名稱為default的群組中.所有的希望查找可用代理的客戶端都可以使用這個代理。?
?
network connector的uri屬性用于查找可用的代理并與之建立代理網絡.這樣配置后,代理就像客戶端一樣,使用多點傳送協議來查找其他代理。?
移除discoveryUri屬性,客戶端就無法通過多點協議掃描到代理。
用多點傳送協議的一個缺點是偵測是自動的.如果你不想把某個代理添加到群組中,你必須十分小心的設置。
客戶端的自動偵測,通信語法是?
discovery:(discoveryAgentURI)?key=value
如connectionFactory = new ActiveMQConnectionFactory("admin", "admin","discovery:(multicast://default)");
將會自動偵測組名為default的代理。?
上面的配置 <transportConnectorname="openwire" uri="tcp://localhost:61616"discoveryUri="multicast://default"/>代理將會被偵測到。?
三、Failover(失效重連協議)
failover:(uri1,...,uriN)?key=value?
或者failover:uri1,...,uriN,如?
failover:(tcp://primary:61616,tcp://secondary:61616)?randomize=false?
詳細查看http://activemq.apache.org/failover-transport-reference.html?
默認情況是先隨機選擇一個連接器,如果該連接器無效,那么會選擇下一個。?
失效轉移連接器URI:是在客戶端方面的協議,客戶端在鏈接代理時需要保證鏈接的可用和可靠。實際上就算客戶端只會連接一個代理,也應該使用failover配置通信協議,保證網絡中斷等問題時會自動重連。?
失效重連協議是客戶端方面的額協議,所以activemq.xml配置文件中就不用配置什么了……
實例:
connectionFactory = new ActiveMQConnectionFactory("admin", "admin","failover:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61617)?randomize=false&priorityBackup=true");首先連接61616 如果連接失敗則連接61617
?
設置連接優先級:
failover:(tcp://local1:61616,tcp://local2:61616,tcp://remote:61616)?randomize=false&priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616其他配置見管網.
?
總結:
1、傳輸連接器:主要是用戶客戶端到消息服務端的連接,在activemq的傳輸連接器<TransportConnector> 中配置,同時客戶端ConnectionFactory中也配置同樣的協議!
2、網絡連接器:主要是代理和代理之間通信的,通信的目的就是數據的拉取!
3、失效重連協議:這個協議是客戶端的協議,在創建ConnectionFactory 對象的時候可以指定多個JMS服務,并且可以指定優先級,這樣就會按照優先級進行連接,如果優先級最高的能連上則連接他如果優先級最高的機器連接不上則連接連接優先級次高的以此類推。
?
總結
以上是生活随笔為你收集整理的JMS学习十 ActiveMQ支持的传输协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java面试题总结(三)----本文都是
- 下一篇: hdu-2066(Dijkstra)