ActiveMQ 四

本章內容:

·         ActiveMQ連接器URIs的描述和演示

·         客戶端如何使用傳輸連接器連接ActiveMQ

·         如何使用網絡連接器創建一個集羣ActiveMQ消息代理器

ActiveMQJMS代理器的目的是爲客戶端應用提供一個交互的架構。所以,ActiveMQ提供連接器(connectors)。連接器提供客戶端到代理器的交互(使用transport connectors),和代理器間的交互(使用network connectors)。ActiveMQ允許客戶端使用各種協議進行連接,同時也運行代理器間通過連接通道來形成複雜的連接器網絡。

    這章我們先解釋連接器URIs,它們是用來指明代理器的地址的。之後,我們介紹傳輸連接器(transport connectors)以及有哪些協議可以用來連接ActiveMQ代理器。

注意:

我們這裏會用到連接器(connector)和協議(protocol)兩個概念。協議是一個通用的概念,而連接器是ActiveMQ特定的一個東西。每個ActiveMQ連接器,實現一個特定的協議,並用它來作爲自己的名字。對於下面將的內容要注意我們是在討論某個協議還是在討論一個特定的ActiveMQ連接器。

 

我們先解釋如果配置傳輸連接器。然後,我們修改股票投資的例子,使之使用各種不同的連接器,並演示該例子。看完該例子後,我們移到特定的連接器,討論的傳輸連接器將包括TCPSSLHTTP。接下來,我們將介紹使用VM協議的嵌入式代理器。

    最後討論的是使用網絡連接器進行ActiveMQ集羣的一些基本概念。我們將演示如果通過static協議創建靜態的網絡連接器,以及客戶端如何通過failover協議穩定地連接到這些網絡連接器上面。使用multicastdisvovery協議的動態連接器也會被討論。這一節只是介紹網絡連接器的一些基本的概念和協議,更多的內容將放到第10章。

 

4.1理解連接器URIs

在討論連接器細節和它們在ActiveMQ架構的角色之前,理解連接器URIs很重要。統一資源定位符(Uniform resource identifiers),作爲一個概念,並不新,而且你可能已經多次使用過它們而沒有意識到而已。URIs第一次被引入來定位資源是在萬維網(World Wide Web)。規範(http://mng.bz/8iPP)URI的定義是:一個用來標識抽象或物理資源的簡潔的字符串。因爲URI的簡單和靈活,它已經很多互聯網服務使用。Web URLsemail地址就是我們日常用的URI的兩個例子。

    我們不去深入討論URIs,不過必須簡要地講一下URI的結構。這對於瞭解爲什麼ActiveMQ使用URI來定位連接器很有幫助。

    基本地,每個URI都遵循下面的格式:

<scheme>:<scheme-specific-part>

考慮下面的URI

mailto:[email protected]

注意使用到了mailto 協議,跟着的是一個email地址唯一地標識了我們要用到的服務和特定的資源。

    最常用的URIs是分層的URIs,它的格式如下:

<scheme>://<authority><path><?query>

這類URI被瀏覽器用來標識網站。有一種類型的URI叫做URL(Uniform Resource Locator)。下面是一個例子:

http://www.nabble.com/forum/NewTopic.jtp?forum=2356

這個URL使用http協議並且使用pathquery元素來指定額外的參數。

    因爲URIs的簡單靈活,ActiveMQ使用它們來定位不同類型的各個連接器。如果你回去看第3章,你可以看到下面的URI被用來創建一個連接器。

tcp://localhost:61616

這是一個典型的分層URI,它的含義是在本地61616端口創建一個TCP連接。

    這類使用簡單分層URI模式的連接器被叫做low-level連接器,它們被用來實現基礎的網絡交流協議。連接器URIs使用schema來表示當前的網絡協議,path元素用來標識網絡資源(通常是地址和端口),query用來指定特殊的配置參數。

4.1顯示了URI的結構。這個URI擴展了前面的例子,它還告訴所有的代理器記錄所有的命令(trace=true部分)。這是TCP端口可選的一個參數。

ActiveMQ的故障轉移傳輸機制支持自動重連。也即是說,如果一個代理器不在線,客戶端可以連到另一個代理器上。ActiveMQ通過使用複合URIs滿足這種需求。在圖4.2,你可以看到一個這種URI

 

注意在scheme部分用到了staticstatic協議將在本章後面討論)並且scheme-specific部分用到了一個或多個地等級URIs。當然,整個URI或者裏面的低層次URI都可以包含查詢參數。

注: 因爲整個URI看起來比較複雜,所以用戶經常會在中間插入空格以增強可讀性。這是不被允許的。因爲URI規範及它的Java實現都這樣要求。所以請記得不要在URI中放任何空格。

現在你已經瞭解了ActiveMQ URI基本知識,我們接下來可以討論ActiveMQ支持的連接器類型。本章接下來部分將討論傳輸連接器和網絡連接器以及如何配置它們。

4.2傳輸連接器

爲了交換信息,生產者和消費者必須連接到代理器。客戶端到代理器的連接是通過傳輸連接器來實現的。ActiveMQ提供了一些客戶端協議,可以用來交換信息。ActiveMQ用戶對連接的要求是多種多樣的。一些用戶關注性能,一些用戶關注安全或其它指標。ActiveMQ嘗試滿足所有這些要求,並對每一種使用場景提供一種連接器。

    在這一節,你將學會在ActiveMQ配置文件中配置傳輸連接器,然後修改股票投資例子來演示這些連接器。接下來的章節,我們將討論網絡連接器可用協議,並介紹內嵌代理器和虛擬機協議。這兩個概念使得代理器可以在你的應用中運行,這個主題將在第七章繼續討論。

 

4.2.1配置傳輸連接器

對於代理器來說,傳輸連接器是用來接受和監聽客戶端連接的。如果你看一看ActiveMQ演示例子的配置文件(conf/activemq-demo.xml),你會看到類似如下的配置:

    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61616"
             discoveryUri="multicast://default"/>
         <transportConnector name="ssl" uri="ssl://localhost:61617"/>
         <transportConnector name="stomp" uri="stomp://localhost:61613"/>
         <transportConnector name="xmpp" uri="xmpp://localhost:61222"/>
      </transportConnectors>

你可以看到傳輸連接器定義在<transportConnectors>元素之間。你通過<transport-Connector>元素定義特定的連接器。ActiveMQ可以不同的端口上設置不同協議的連接器。一個連接器必須有自己唯一的名字和URI屬性。在這個例子中,URI定義了網絡協議和可選參數,通過它們,ActiveMQ將被曝露出來給客戶端連接。discoveryUri屬性是可選的,這個屬性將在4.3.1節講解。

    上面的片段定義了4個傳輸連接器。當你通過使用這樣的配置文件啓動ActiveMQ,你將看到如下日誌:

INFO TransportServerThreadSupport - Listening for connections at:
tcp://localhost:61616

INFO TransportConnector - Connector openwire Started
INFO TransportServerThreadSupport - Listening for connections at:
ssl://localhost:61617
INFO TransportConnector - Connector ssl Started
INFO TransportServerThreadSupport - Listening for connections at:
stomp://localhost:61613
INFO TransportConnector - Connector stomp Started
INFO TransportServerThreadSupport - Listening for connections at:
xmpp://localhost:61222
INFO TransportConnector - Connector xmpp Started

 

從客戶端角度,傳輸連接器是一個連接,通過它可以向代理器發送和接收消息。發送和接收消息的內容放在第七章。下面的代碼展示了java應用如何使用傳輸連接器URIs

ActiveMQConnectionFactory factory =
    new ActiveMQConnectionFactory("tcp://localhost:61616 ");
Connection connection = factory.createConnection();
connection.start();
Session session =
    connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

我們可以看到,在配置文件裏定義的URI被客戶端用來創建連接。在這個例子中,TCP傳輸URI將被使用。

注:我們可以在客戶端和服務器端是用URIquery部分。通常地,這些參數對於客戶端和服務器端都有用,但其中的一些只能用在某一部分。所以,在使用這些特定查詢參數前請先查看文檔說明。

理解了基本的傳輸連接器配置之後,我們應該瞭解ActiveMQ提供了哪些類型的傳輸連接器。不過在我們講解特定傳輸連接器之前,我們先修改股票投資例子,讓它使用不同的傳輸連接器。

 

4.2.2修改股票投資例子

第三章引入了一個股票投資例子,它用ActiveMQ來發布和消費股票交易消息。當時,我們使用標準的連接器URI,因爲我們想讓這個例子看起來儘量簡單。這一章,我們將介紹所有的協議並同意股票投資例子來使用它們。所以,我們要修改該例子,讓它使用任意的協議工作。

    列表4.1main()一個修改後的版本。

Listing 4.1 Modifying stock portfolio publisher to support various connector URIs

 前面的代碼保證連接器URI作爲第一個參數被傳遞,並且剩下的參數是額外的目標的名稱。現在,生產者可以通過下面的命令來運行:

$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Publisher \
-Dexec.args="tcp://localhost:61616 CSCO ORCL"
 
...
Sending: {price=65.713356601409, stock=JAVA, offer=65.779069958011,
up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=66.071605671946, stock=JAVA, offer=66.137677277617,
up=true}
on destination: topic://STOCKS.JAVA
Sending: {price=65.929035001620, stock=JAVA, offer=65.994964036622,
up=false}
on destination: topic://STOCKS.JAVA
...

注意到現在有三個參數被傳送給生產者。我們也可以用相同的方法來修改消費者。在下面的列表中,被修改後的消費者把第一個參數作爲URI來使用。

Listing 4.2 Modifying stock portfolio consumer to support various connector URIs

 爲了達到和第三章相同的功能,你必須提供一個額外的URI參數。下面的例子展示瞭如何做:

$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer \
-Dexec.args="tcp://localhost:61616 CSCO ORCL"
 
...
ORCL 65.71 65.78 up
ORCL 66.07 66.14 up
ORCL 65.93 65.99 down
CSCO 23.30 23.33 up
...

注意,消息在生產者和消費者之間的流動是和原始例子一樣。通過這些修改,現在這個例子可以使用各種協議運行了。現在我們應該深入到特定的連接器裏面了。下面的部分你將看到你通過網絡連接代理器有什麼選擇。

4.3通過網絡連接ActiveMQ

ActiveMQ最常用的場景是將它作爲一個Java應用來使用。這意味着客戶端(生產者和消費者)必須使用一些網絡協議來連接代理器目標。在這一節,我們將介紹那些可以用在客戶端-代理器交互場景中的網絡協議。

    我們先介紹TCP連接器,它最常用並且能提供理想的性能。然後是NIO連接器,它底層使用了TCP網絡協議,但因爲還用到了NIO Java API所以比TCP連接器有更好的伸縮性。UDP網絡協議也經常被使用,所以UDP連接器也在討論清單裏。UDP協議與TCP相比帶來一些性能的提升,但也損失了一些可靠性。UDP連接器也如此。因爲UDP連接器的不可靠性,所以它使用的場景較少。SSL連接器能夠與代理器維持一個安全連接。最後,我們將向你展示如何使用HTTP連接代理器。當然,在每一部分我們會討論各種連接器的利弊。所以,你也可以考慮只閱讀你感興趣的部分,然後直接跳過去閱讀下一章。表4.1包含了各種連接器的一個簡要描述。現在讓我們開始默認的TCP協議。

4.3.1 傳輸控制協議(TCP

現在對人們來說,TCP協議可能和電力一樣重要。作爲一個基礎的因特網協議,幾乎所有的在線交流都用到它。像emailweb等很多服務都使用它作爲底層的網絡協議。

    希望你己經對TCP基本信息有了瞭解,我們將從引述RFC793協議開始。(http://mng.bz/Bns2:

        Transmission Control Protocol(TCP)是爲分組交換主機及內部系統間交換提供可靠的網絡而設計的。

既然代理器和客戶端應用是需要通過可靠的網絡來交換的,那麼很容易理解爲什麼TCP對於JMS實現來說是一個理想的協議。所以,TCP作爲ActiveMQ最常用的連接器並不讓人感到意外。在通過網絡交換消息前,需要先把消息序列化成合適的形式。使用wire協議,消息被序列化成字節序列在電線上發送。ActiveMQ使用的默認wire協議叫做OpenWire。該協議規範可以在ActiveMQ網站找到(http://mng.bz/u2eT.OpenWire協議不止可以用在TCP網絡傳輸,也可以用在其它網絡協議上。它的目的是高效地,並且允許在網絡上快速交換數據。還有,像OpenWire這樣一個標準的,開放的協議能夠在各種編程環境中被使用。這個協議和其它ActiveMQ可用的wire協議將在第九章討論。

    就像我們在前面章節看到的,一個默認的代理器配置會在端口61616上監聽客戶端的TCP傳輸連接。TCP連接器URI使用下面的語法:

tcp://hostname:port ?key=value&key=value

注意黑體字部分是必需的。在問號右邊的key value對是可選的,並且各組keyvalue間用&符號分隔。

    在本節或之後,我們不會完整地討論該傳輸協議的所有可選的部分。這些東西應該放到網上的參考頁面。最新的TCP連接器參考頁是(http://mng.bz/ngU2)

    下面的配置片段提供了一個使用TCP連接器的例子:

<transportConnectors>
    <transportConnector name="tcp"
        uri="tcp://localhost:61616?trace=true"/>
</transportConnectors>

注意到trace選項可以被添加到URI後面。這個選項建議代理器記錄所有通過該連接器發送過來的命令,這對調試非常有幫助。

     重要提示 :修改配置文件後,ActiveMQ必須重啓才能生效。

上面的內容概述了客戶端使用TCP連接代理器。作爲參考,下面的例子演示了消費者如何使用TCP連接器。

$ mvn exec:java -Dexec.mainClass=org.apache.activemq.book.ch4.Consumer \
-Dexec.args="tcp://localhost:61616 CSCO ORCL"

ORCL 65.71 65.78 up
ORCL 66.07 66.14 up
ORCL 65.93 65.99 down
CSCO 23.30 23.33 up
...

使用TCP連接器的好處有:

·         高效----這個連接器使用OpenWire協議將消息轉換成字節流,所以在網絡上傳輸非常高效。

·         可用----TCP是使用最廣的一種網絡協議,而且在很久前就被Java所支持。所以,該協議幾乎可以支持你選擇的所有平臺。

·         可靠性----TCP協議保證消息不會丟失。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章