?連接到ActiveMQ
Connector:ActiveMQ提供的,用來實現連接通信的功能。包括:client-to-broker、broker-to-broker。ActiveMQ允許客戶端使用多種協議來進行連接。
client-to-broker模式一般是配置文件中的transportConnector配置
broker-to-broker:一般是指網絡(network)===后面學習?
?
ActiveMQ支持的client-to-broker的通信協議如下:最常用的也就是TCP和NIO
1.TCP:這個也是缺省值
2.NIO
3.UDP
4.SSL
5.Http(s)
6.VM:如果客戶端和broker在一個虛擬機內的話,通過VM協議通訊在VM內通訊,從而減少網絡傳輸的開銷
配置transportConnectors,位于conf/activemq.xml,大致如下:
<!--The transport connectors expose ActiveMQ over a given protocol toclients and other brokers. For more information, see:http://activemq.apache.org/configuring-transports.html--><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>
文件的注釋也注明了更詳細協議以及參數的配置參考:http://activemq.apache.org/configuring-transports.html
1.Transmission Control Protocol (TCP)---常用
1.這是默認的Broker配置,TCP的Client監聽端口是61616。
2.在網絡傳輸數據前,必須要序列化數據,消息是通過一個叫wire protocol的來序列化成字節流。默認情況下,ActiveMQ把wire protocol叫做OpenWire,它的目的是促使網絡上的效率和數據快速交互。?
3.TCP連接的URI形式:tcp://hostname:port?key=value&key=value。其中前面部分是必須的,參數是可選的
4.TCP傳輸的優點:
TCP協議傳輸可靠性高,穩定性強。
高效性:字節流方式傳遞,效率很高。
有效性、可用性:應用廣泛,支持任何平臺。
2.New I/O API Protocol (NIO)---常用
1.NIO協議和TCP協議類似,但NIO更側重于底層的訪問操作。它允許開發人員對同一資源可有更多的client調用和服務端有更多的負載。
2.適合使用NIO協議的場景:
可能有大量的Client去鏈接到Broker上可能對于Broker有一個很遲鈍的網絡傳輸NIO的實現比TCP需要更少的線程去運行,所以建議使用NIO協議。
可能對于Broker有一個很遲鈍的網絡傳輸。
我們在上面的配置文件中增加nio的連接:
<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="nio" uri="nio://0.0.0.0:61618?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>
程序中修改對應的url即可,如下:
private static final String url = "nio://0.0.0.0:61618/";
?
3.User Datagram Protocol (UDP)
1.UDP和TCP的區別:
(1)TCP是一個原始流的傳遞協議,意味著數據包是有保證的,換句話說,數據包是不會被復制和丟失的。UDP是不會保證數據包的傳遞的。
(2)TCP也是一個穩定可靠的數據包傳遞協議,意味著數據在傳遞的過程中不會被丟失。這樣確保了在發送和接收之間能夠可靠的傳遞。相反,UDP僅僅是一個鏈接協議,所以它沒有可靠性之說。
2. 從上面可以得出:TCP是被用在穩定可靠的場景中使用的;UDP通常用在快速數據傳遞和不怕數據丟失的場景中,還有ActiveMQ通過防火墻時,只能用UDP。
3.?UDP連接的URI形式:udp://hostname:port?key=value
?
4. Secure Sockets Layer Protocol (SSL) 安全鏈路保護
連接的URI形式:ssl://hostname:port?key=value
?
5.Hypertext Transfer Protocol (HTTP/HTTPS)
1.像web和email等服務需要通過防火墻來訪問的,Http可以使用這種場合。
2.連接的URI形式:http(https)://hostname:port?key=value
?
6.VM Protocol (VM)
1.? VM transport允許在VM內部通信,從而避免了網絡傳輸的開銷。這時候采用的連接不是socket連接,而是直接的方法調用。
2.??第一個創建VM連接的客戶會啟動一個embed VM broker(內嵌虛擬機服務),接下來所有使用相同的broker name的VM連接都會使用這個broker。當這個broker上所有的連接都關閉的時候,這個broker也會自動關閉。
3. 連接的URI形式:vm://brokerName?key=value
4. Java中嵌入的方式 vm:broker:(tcp://localhost:61616)?brokerName=embddedbroker&persistent=false
?