ACTIVEMQ 之uri

JMS代理(如ActiveMQ broker)的主要做用是爲客戶端程序提供一種通訊機制.爲此,ActiveMQ提供一種鏈接機制,
這種鏈接機制使用傳輸鏈接器(transport connector)實現客戶端與代理(client-to-broker)之間的通訊
理解鏈接器的uri
<scheme>:<sheme-specific-part>
最普通的uri
<scheme>://<authority><path><?query>
tcp://localhost:61616//create a tcp connection to the localhost on port 61616
鏈接器用schema來識別隱含的網絡協議,這個路徑識別網絡資源(一般是host和port)和查詢元素來完整的加入額外的配置參數
activemq故障轉移支持重連,只要鏈接另外一個代理
傳輸鏈接器
爲了交換消息,消費者和生產者都須要鏈接代理,,這個 客戶端-代理的通信協議表現的很好經過傳輸的鏈接器, activemq提供了
一個使人深入的協議,客戶端也能用來交換信息,用戶對鏈接的需求是不一樣的,一些用戶關心性能, 有些關注安全等等,activemq試着
覆蓋各個方面和提供一個鏈接器用例
配置鏈接器
從代理視角來看, 傳輸的鏈接器是用來接受和監聽來自客戶端的鏈接
鏈接配置
文件conf/activemq-demo.xml提供的示例有一段內容

Xml代碼  收藏代碼

    <!--  
                The transport connectors expose ActiveMQ over a given protocol to  
                clients and other brokers. For more information, see:  
      
                http://activemq.apache.org/configuring-transports.html  
            -->  
            <transportConnectors>  
                <!-- Create a TCP transport that is advertised on via an IP multicast  
                  group named default. -->  
                <transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>  
                <!-- Create a SSL transport. Make sure to configure the SSL options  
                  via the system properties or the sslContext element. -->  
                <transportConnector name="ssl" uri="ssl://localhost:61617"/>  
                <!-- Create a STOMP transport for STOMP clients. -->  
                <transportConnector name="stomp" uri="stomp://localhost:61613"/>  
                <!-- Create a Websocket transport for the websocket dmeo -->  
                <transportConnector name="ws" uri="ws://localhost:61614/" />  
            </transportConnectors>  

正如你看到的transport Connectors被定義在transportConnectors元素中你能夠定義transportConnectors 來綁定元素,同時active mq也支持許多協議監聽在不一樣端口
鏈接器的配置必須是惟一的定義他們的name 和url參數,在這個列子中uri定義網絡協議和可選參數

 INFO | Recovering from the journal ...
 INFO | Recovery replayed 2 operations from the journal in 0.027 seconds.
 INFO | ActiveMQ 5.5-SNAPSHOT JMS Message Broker (localhost) is starting
 INFO | For help or more information please see: http://activemq.apache.org/
 INFO | Listening for connections at: tcp://CDCH20100020-5:61616
 INFO | Connector openwire Started
 INFO | ActiveMQ JMS Message Broker (localhost, ID:CDCH20100020-5-60017-14531867
53335-0:1) started
 INFO | jetty-7.1.6.v20100715
 INFO | ActiveMQ WebConsole initialized.
 INFO | Initializing Spring FrameworkServlet 'dispatcher'
 INFO | ActiveMQ Console at http://0.0.0.0:8161/admin
 INFO | Initializing Spring root WebApplicationContext
 INFO | OSGi environment not detected.
 INFO | Apache Camel 2.7.0 (CamelContext: camel) is starting
 INFO | JMX enabled. Using ManagedManagementStrategy.
 INFO | Found 5 packages with 16 @Converter classes to load
 INFO | Loaded 152 type converters in 0.809 seconds
 INFO | Connector vm://localhost Started
 INFO | Route: route1 started and consuming from: Endpoint[activemq://example.A]
 INFO | Total 1 routes, of which 1 is started.
 INFO | Apache Camel 2.7.0 (CamelContext: camel) started in 1.600 seconds
 INFO | Camel Console at http://0.0.0.0:8161/camel
 INFO | ActiveMQ Web Demos at http://0.0.0.0:8161/demo
 INFO | RESTful file access application at http://0.0.0.0:8161/fileserver
 INFO | Started SelectCh,annelConnector@0.0.0.0:8161
 從客戶端視角來看,傳輸的鏈接器用代理來建立鏈接爲了發送和接受消息
 ctiveMq支持的網絡協議
協議    描述
TCP    默認的協議,性能相對能夠
NIO    基於TCP協議之上的,進行了擴展和優化,具備更好的擴展性
UDP    性能比TCP更好,可是不具備可靠性
SSL    安全連接
HTTP(S)    基於HTTP或者HTTPS
VM    VM自己不是協議,當客戶端和代理在同一個Java虛擬機(VM)中運行時,他們之間須要通訊,但不想佔用網絡通道,而是直接通訊,可使用該方式
tCP是ActiveMQ默認的協議,訪問方式是
tcp://hostname:port?key=value&key=value
採用方式爲openwire,目的是爲了快速交換消息
配置示例


    <transportConnectors>  
    <transportConnector name="tcp"  
    uri="tcp://localhost:61616?trace=true"/>  //trace暗示會將debug的信息打印出來,而且在改變了配置文件後必須重啓activemq
    </transportConnectors>  



其中trace是active提供的參數,用於打開日誌,記錄每次的經過該連接通道的命令。
NIO
提供了selectors和非阻塞方式的IO訪問,基於TCP,可是提供了更好的性能,
條件:對於大訪問量時,能夠考慮【操做系統提供的線程有限】,2.在鏈接代理時有大量的網絡阻塞

訪問及配置
nio://hostname:port?key=value

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



UDP
並不保證數據有效性,如在線遊戲等狀況。

udp://hostname:port?key=value


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


SSL
ssl://hostname:port?key=value


    <transportConnectors>  
    <transportConnector name="ssl" uri="ssl://localhost:61617?trace=true" />  
    </transportConnectors>  

1.using key too, create a certificate for the broker:
keytool -genkey -alias broker -keyalg RSA -keystore broker.ks

2.Export the broker's certificate so it can be shared with clients:
keytool -export -alias broker -keystore broker.ks -file broker_cert
3.Create a certificate/keystore for the client:
keytool -genkey -alias client -keyalg RSA -keystore client.ks
4.Create a truststore for the client, and import the broker's certificate. This establishes that the client "trusts" the broke
keytool -import -alias broker -keystore client.ts -file broker_certhtml

默認的安全證書位於conf的broker.ts,和broker.ks文件該證書爲示例證書,若是要使用SSL協議,須要本身生成相應的環境下的證書。
對應的客戶端證書是client.ts,和client.ks封裝後的tcp保證安全
在訪問SSL連接時,須要指定使用的證書文件(jvm系統屬性)必須指定如下參數
java
-Djavax.net.ssl.keyStore=${ACTIVEMQ_HOME}/conf/client.ks \
-Djavax.net.ssl.keyStorePassword=password \
-Djavax.net.ssl.trustStore=${ACTIVEMQ_HOME}/conf/client.ts \

若是指定使用了其餘的證書,在服務端配置部分,須要在broker上面面添加

   <sslContext>
        <sslContext keyStore="file:${activemq.base}/conf/broker.ks" keyStorePassword="test123"/>
        </sslContext>java

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

web

-Djavax.net.ssl.keyStorePassword=test123 -Djavax.net.ssl.trustStore=E:\activemq\apache-activemq-5.4.1/conf/broker.ts 。。。。或者apache

        System.setProperty("javax.net.ssl.keyStore","E:\\activemq\\apache-activemq-5.4.1\\conf\\broker.ks");
        System.setProperty("javax.net.ssl.keyStorePassword","test123");
        System.setProperty("javax.net.ssl.trustStore","E:\\activemq\\apache-activemq-5.4.1\\conf\\client.ts");
        System.setProperty("javax.net.ssl.trustStorePassword","test123"); 
安全



啓用/禁用 SSL加密套件
ActiveMQ的SSL傳輸鏈接器使用的SSL加密套件(SSL cipher suites)由JVM提供.關於加密套件的詳細信息
請參考SUN的JSSE文檔。每種加密套件的實現等都不同,從5.4.0版本的ActiveMQ開始支持新的參數transport.enabledCipherSuites
<transportConnectors>
<transportConnector
name="ssl"
uri="ssl://localhost:61617?transport.enabledCipherSuites=SSL_RSA_WITH_RC4_128_SHA" />
</transportConnectors>websocket


如上使用的是SSL_RSA_WITH_RC4_128_SHA套件。能夠開啓多個加密套件,使用逗號分割。網絡



http://hostname:port?key=value

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

http須要添加幾個依賴包
activemq-optional-<version>.jarapp

commons-httpclient-<version>.jardom

xstream-<version>.jarjvm

xmlpull -<verision>.jarhttp://hostname:port?key=value<transportConnectors><transportConnector name="tcp"uri="tcp://localhost:61616?trace=true"/><transportConnector name="http"uri="http://localhost:8080?trace=true" /></transportConnectors>http須要添加幾個依賴包commons-httpclientxstreamxmlpull虛擬機內部通訊Java應用程序中的VM傳輸鏈接器用於啓動並鏈接到一個內嵌的代理.使用VM傳輸鏈接器意味着客戶端和內嵌帶代理之間不須要網絡鏈接,經過直接調用代理對象的方法來實現通訊.由於使用VM鏈接器後不須要網絡協議的參與,因此性能顯著提升.使用VM協議首次鏈接到代理時會啓動代理,同一個虛擬機中全部後續的VM傳輸鏈接都將鏈接到這個代理.使用VM協議的代理具備標準ActiveMQ代理的全部特性.當全部使用VM傳輸鏈接到代理的客戶端都關閉鏈接後,代理自動關閉.配置VM鏈接器的URI語法以下:vm://brokerName?key=value如vm://broker1?marshal=false&broker.persistent=falseURI中brokerName配置很是重要,它是代理的惟一標識.例如,你能夠經過配置兩個不一樣的broker name建立兩個不一樣的嵌入式代理,必須保證brokerName是惟一的。還能夠嵌入URI的方式vm:broker:(transportURI,network:networkURI)/brokerName?key=value如配置的URI是vm:broker:(tcp://localhost:6000)?brokerName=embeddedbroker&persistent=false咱們定義了一個名稱爲embeddedBroker的代理,同時配置了一個TCP鏈接器在6000端口監聽鏈接,而同一個jvm內運行的程序能夠經過vm鏈接,不一樣jvm的外部程序,能夠經過tcp://localhost:6000鏈接到這個代理。經過配置傳輸選項的brokerConfig參數,在URI中指定activemq.xml做爲配置文件,可使用外部配置文件來配置嵌入式代理.下面是配置例子:vm://localhost?brokerConfig=xbean:activemq.xml該實例的配置會在類路徑中根據xbean:協議查找activemq.xml文件.經過這種方式,使用XML做爲配置文件能夠像配置一個獨立的代理那樣來配置嵌入式代理.網絡鏈接器集羣的代理網絡,包含了多個MQ實例。默認是單向的,代理只將其收到的消息發送到收消息鏈接另外一頭的代理,如A指接受B的代理信息,但A並不會發送消息到B,而只發送到B以外的其餘。一般稱爲轉發橋。另外還有一種是雙向的A即會接受來自B的,也會把消息發送給B。    <networkConnectors>        <networkConnector name="default-nc" uri="multicast://default"/>      </networkConnectors>  name和uri是必須的。偵測.一般,偵測是一種搜尋遠程代理服務的過程.一般,客戶端但願可以偵測到全部可用的代理.另外一方面,代理也但願可以偵測到其餘可用的代理,以即可以和他們創建一個代理網絡.靜態網絡鏈接器靜態網絡鏈接器用於爲一個網絡中多個代理建立靜態配置.這種配置協議使用了一種複合的URI--即包含其餘URI的URI.下面是靜態協議使用的URI語法:static:(uri1,uri2,uri3,...)?key=value    <networkConnectors>        <networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>      </networkConnectors>  示例代理B配置    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.base}/data">      <transportConnectors>        <transportConnector name="openwire" uri="tcp://localhost:61617" />      </transportConnectors>      </broker>  啓動代理B${ACTIVEMQ_HOME}/bin/activemq console xbean:src/main/resources/org/apache/activemq/book/ch4/brokerB.xml代理A配置    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerA" dataDirectory="${activemq.base}/data">        <transportConnectors>          <transportConnector name="openwire" uri="tcp://localhost:61616" />        </transportConnectors>        <networkConnectors>          <networkConnector uri="static:(tcp://localhost:61617)" />        </networkConnectors>      </broker>  啓動代理A${ACTIVEMQ_HOME}/bin/activemq console \xbean:src/main/resources/org/apache/activemq/book/ch4/brokerA.xml當消息發送到代理A,代理A會向B也發送消息,消息消費者能夠經過代理B接收到消息。鏈接失敗失效轉移連協議,有兩種實現,靜態的代理和動態偵測語法,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配置通訊協議,保證網絡中斷等問題時會自動重連。動態網絡這種動態技術能夠實現讓客戶端和代理之間,代理和代理之間實現動態識別,而不是配置靜態的IP組。多點傳送協議,代理會廣播本身的服務,也會定位其餘代理。同理客戶端能夠經過多點協議來接收廣播,識別出代理。多址傳送協議的URI語法以下:multicast://ipadaddress:port?key=value    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.base}/data">        <networkConnectors>          <networkConnector name="default-nc" uri="multicast://default"/>        </networkConnectors>                <transportConnectors>          <transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>        </transportConnectors>      </broker>  在上面的例子中,使用羣組名稱"default"來替代具體的IP地址.上面的配置代碼片斷中有兩個地方比較重要.首先,transport connector的discoveryUri屬性用於暴露這個傳輸鏈接器的URI到名稱爲default的羣組中.全部的但願查找可用代理的客戶端均可以使用這個代理。network connector的uri屬性用於查找可用的代理並與之創建代理網絡.這樣配置後,代理就像客戶端同樣,使用多點傳送協議來查找其餘代理。,移除discoveryUri屬性,客戶端就沒法經過多點協議掃描到代理,用多點傳送協議的一個缺點是偵測是自動的.若是你不想把某個代理添加到羣組中,你必須十分當心的設置。客戶端的自動偵測,通訊語法是discovery:(discoveryAgentURI)?key=value,,如discovery:(multicast://default)將會自動偵測組名爲default的代理。上面的配置<transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/>將會被偵測到。點對點協議點對點鏈接器是一種傳輸鏈接器網絡,是構成點對點的嵌入式代理網絡中全部虛擬鏈接器的集合.點對點協議的URI語法以下:peer://peergroup/brokerName?key=value使用一個點對點協議的RUI啓動應用程序會自動啓動一個嵌入式代理(就像使用VM協議同樣),同時還會配置代理以和相同組名的代理之間創建網絡鏈接.VM也會啓動一個內置代理器。peer://group1如上客戶端配置的通訊協議若是是這樣的話,那麼會啓動一個內嵌代理,而且客戶端會和該內嵌代理通訊,而內嵌代理會與組名是group1的代理之間創建網絡通訊。FANOUT鏈接器Fanout是一種通訊器羣組,用於使得客戶端能夠同時鏈接到多個代理並對這些代理進行相同的操做.Fanout協議的URI語法以下:fanout:(fanoutURI)?key=valuefanoutURI值可使用靜態的URI或者多點傳送URI.參考下面的示例:fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))客戶端將嘗試鏈接掉3個使用靜態協議配置的靜態代理.使用動態效果fanout:(multicast://default)此協議的目的是發送消息到多個代理.其次,若是你使用的代理屬於同一個代理網絡,那麼指定的消息消費者可能會接收到重複的消息.所以,一般狀況下,fanout協議僅用於發佈消息到多個相互之間沒有鏈接在一塊兒的代理.即多個代理之間的獨立的。總結Protocol            Description協議                描述Static          Used for defining networks of brokers with known addressess靜態協議        用於定義地址已知的代理之間的網絡Failover        Used to provide reconnection logic for clients to the network of brokers or a single broker失效重連協議    用於爲客戶端提供自動重連邏輯,以便客戶端可以從新鏈接到一個代理網絡或者單個代理Multicast       Used for defining dynamic networks of brokers (broker addresses are not statically defined)多點傳送協議    用於定義一個動態的代理網絡(代理的地址無需靜態指定)Discovery       Used by clients to connect to dynamic network of brokers自動偵測協議    客戶端用來鏈接到動態網絡代理Peer            Used to easily connect multiple embedded brokers點對點協議      用於方便的鏈接到多個嵌入式代理Fanout          Used to produce messages to multiple unconnected brokers扇出協議        用於發送消息到多個未互聯的代理

相關文章
相關標籤/搜索