首先你得了解什麼是MOM: MOM(Message Oriented Middleware),分佈式系統的集成,指的是利用高效可靠的消息傳遞機制進行平臺無關的數據交流,並基於數據通訊來進行分佈式系統的集成。
javascript
而後你得知道什麼是JMS: JMS(Java Message Service)Java消息服務,應用程序接口,是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。
java
摘要來自百度百科,這裏就不對前兩個進行贅述,有興趣的自行Google。 :cherries:git
其實也就是爲何要使用MQ。 :watermelon:github
異步通訊 不須要即時處理的業務,將其放去消息隊列中,在須要處理的時候直接去隊列中取出來,達到了生產者和消費者不用互相瞭解對方,生產者只須要專一於生產,消費者專一於消費。服務器
解耦 下降工程之間的耦合程度,從設計角度來說,達到低耦合高內聚的目的。當應用須要維護的時候,不一樣應用能夠獨立的擴展或修改,只須要遵循一樣的接口約束便可。session
冗餘 消息隊列能夠對隊列中的消息進行持久化處理,防止數據丟失。不少消息隊列都採用「插入-獲取-刪除」的模式,只有當處理數據的過程成功而且返回提示,纔會進行消息的刪除,不然消息將一直保存在隊列之中。異步
過載保護 在請求量突發的高峯期間,爲了讓系統保持正常工做,又不想每時每刻都按最大峯值投入資源。使用消息隊列就可讓關鍵組件頂住突發壓力,不至於讓整個系統崩潰。socket
保證有序 消息隊列能夠對消息進行優先級設定,而後根據優先級來對消息進行排序,達到重要數據優先處理。tcp
緩衝 消息隊列有助於控制和優化數據流通過系統的速度。以調節系統響應時間。分佈式
數據流處理 大數據業務須要對數據流進行分析,在消息隊列中進行處理是最好不過的。
兩種運行模型
ActiveMQ的組成模塊
ActiveMQ的經常使用協議
AMQP協議 AMQP即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消 息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣開發語言等條件的限制。
MQTT協議 MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是IBM開發的一個即時 通信協議,有可能成爲物聯網的重要組成部分。該協議支持全部平臺,幾乎能夠把全部聯網 物品和外部鏈接起來,被用來當作傳感器和致動器(好比經過Twitter讓房屋聯網)的通訊協 議。
STOMP協議 STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息協議,是一種爲 MOM(Message Oriented Middleware,面向消息的中間件)設計的簡單文本協議。STOMP提 供一個可互操做的鏈接格式,容許客戶端與任意STOMP消息代理(Broker)進行交互。
OPENWIRE協議 ActiveMQ特有的協議,官方描述以下 OpenWire is our cross language Wire Protocol to allow native access to ActiveMQ from a number of different languages and platforms. The Java OpenWire transport is the default transport in ActiveMQ 4.x or later. For other languages see the following...
對於ActiveMQ的上述協議,每種協議端口都不同,能夠自行修改。:tangerine:
編輯activemq.xml,在transportConnectors標籤中註銷、修改或刪除不使用的協議。
<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"/>
複製代碼
csharp做爲生產者實例。
//根據URI建立NMS鏈接工廠
NMSConnectionFactory factory = new NMSConnectionFactory(brokerUri);
//根據用戶名密碼建立鏈接
IConnection connection = factory.CreateConnection(user, password);
//打開鏈接
connection.Start();
//建立Session
ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
//根據destination建立主題
IDestination dest = session.GetQueue(destination);
//建立生產者
IMessageProducer producer = session.CreateProducer(dest);
producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
//發送消息
String body = "hello,javaJMS!! I'm C#";
producer.Send(session.CreateTextMessage(body));
//關閉鏈接
connection.Close();
複製代碼
建立Session時能夠爲會話設定消息確認模式:
相關實踐在這裏不進行詳細描述,詳情能夠參考個人Demo項目。:lemon: 以ActiveMQ爲消息中間件,關聯dotnet,java,ws三種平臺