ActiveMQ訊息傳送模型

2021-07-22 04:32:59 字數 1533 閱讀 2718

無論採用哪種jms 元件,jms 支援兩種截然不同的訊息傳送模型:ptp(即點對點模型)和pub/sub(即發布/訂閱模型),分別稱作:ptp domain 和pub/sub domain。

ptp(使用queue即佇列目標)    

訊息從乙個生產者傳送至乙個消費者。在此傳送模型中,目標是乙個佇列。訊息首先被傳送至佇列目標,然後根據佇列傳送策略,從該佇列將訊息傳送至向此佇列進行註冊的某乙個消費者,一次只傳送一條訊息。可以向佇列目標傳送訊息的生產者的數量沒有限制,但每條訊息只能傳送至、並由乙個消費者成功使用。如果沒有已經向佇列目標註冊的消費者,佇列將保留它收到的訊息,並在某個消費者向該佇列進行註冊時將訊息傳送給該消費者。 

pub/sub(使用topic即主題目標)    

訊息從乙個生產者傳送至任意數量的消費者。在此傳送模型中,目標是乙個主題。訊息首先被傳送至主題目標,然後傳送至所有已訂閱此主題的活動消費者。可以向主題目標傳送訊息的生產者的數量沒有限制,並且每個訊息可以傳送至任意數量的訂閱消費者。

持久訂閱和非持久訂閱者:

非持久訂閱只有當客戶端處於啟用狀態,也就是和jms provider 保持連線狀態才能收到傳送到某個主題的訊息,而當客戶端處於離線狀態,這個時間段發到主題的訊息將會丟失,永遠不會收到。

持久訂閱表示消費者已向主題目標進行註冊,但在訊息傳送時此消費者可以處於非活動狀態。當此消費者再次處於活動狀態時,它將接收此資訊。如果沒有已經向主題目標註冊的消費者,主題不保留其接收到的訊息,除非有非活動消費者註冊了持久訂閱。

持久訂閱時,客戶端向jms 伺服器註冊乙個自己身份的id,當這個客戶端處於離線時,jms provider 會為這個id 儲存所有傳送到主題的訊息,當客戶再次連線到jms provider時,會根據自己的id得到所有當自己處於離線時傳送到主題的訊息。

**示例:

// 建立connection

connection = connectionfactory.createconnection();

connection.setclientid("bbb"); //持久訂閱需要設定這個。

connection.start();

// 建立session

session session = connection.createsession(false,session.auto_acknowledge);

// 建立destination

topic topic = session.createtopic("usersynctopic"); //topic名稱

//messageconsumer consumer = session.createconsumer(topic); //普通訂閱

messageconsumer consumer = session.createdurablesubscriber(topic,"bbb"); //持久訂閱

本文出自 「點滴積累」 部落格,請務必保留此出處

ActiveMQ訊息傳送模型

無論採用哪種jms 元件,jms 支援兩種截然不同的訊息傳送模型 ptp 即點對點模型 和pub sub 即發布 訂閱模型 分別稱作 ptp domain 和pub sub domain。ptp 使用queue即佇列目標 訊息從乙個生產者傳送至乙個消費者。在此傳送模型中,目標是乙個佇列。訊息首先被傳...

ActiveMQ非同步傳送訊息

非同步傳送 tcp localhost 61616?jms.useasyncsend true 從 activemq 5 開始可以控制非同步傳送流。也就是說,在受到 broker 的確認應答之前,生產者能夠傳送訊息給 broker 的最大資訊量。即使是非同步傳送訊息,生產者也是在收到 broker ...

ActiveMq點對點模式傳送 接收訊息

訊息傳送流程 1 客戶機傳送訊息到jms訊息中介軟體 2 服務端負責監聽jms訊息目的地。3 發現jms裡面有訊息產生,服務就可以接受訊息。點對點訊息傳送服務 1 訊息只能被乙個服務接受 2 多個服務同時監聽訊息伺服器,遵循先來後到原則。3 訊息一旦被接受,訊息自動消失。4 如果訊息一直沒有被接受,...