1. 程式人生 > >JMS學習十 ActiveMQ支援的傳輸協議

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服務,並且可以指定優先順序,這樣就會按照優先順序進行連線,如果優先順序最高的能連上則連線他如果優先順序最高的機器連線不上則連線連線優先順序次高的以此類推。