RabbitMQ學習筆記 2

2021-09-12 12:40:16 字數 1644 閱讀 5506

由乙個生產者進行生產,經由訊息佇列,被多個消費者消費。

傳送端**如下:

public class newtask 

}

接收端**如下:

public class worker 

}public static void main(string args) throws exceptioncatch (interruptedexception e)finally

};boolean autoack = true;

channel.basicconsume(queue_name, autoack, delivercallback, consumertag -> );}}

idea工具如下:

執行結果如下:

結果顯示,mq容器把訊息平均的分配給兩個消費者進行了消費。

自此,很容易想到,當訊息(任務)傳遞到queue之後,它立馬會由某乙個worker進行標記。可能會有這種情形,如果某乙個worker處理task耗時太久,或者該worker被我們kill掉了。那麼由他標記的訊息將會丟失。

這種情形我們不想丟失訊息,rabbitmq提供了一種訊息回執(message acknowledgment)機制。

boolean autoack = true;//表示關閉訊息回執

當worker 掛掉之後正在處理的該條訊息仍然會丟失。那麼這個時候我們可以通過訊息的持久化來處理這種情形。

boolean durable = true;

channel.queuedeclare("task_queue", durable, false, false, null);

channel.basicpublish("", "task_queue",

messageproperties.persistent_text_plain,

message.getbytes());

*已經定義的佇列不能更改他的屬性為持久化,必須重新定義乙個新的佇列。

由上面的列印圖可以看出,mq是把第n條訊息輪流分給每個佇列。如果每個佇列處理訊息的時間不一致,就會出現有的worker很閒,有的很忙。要充分利用能者多勞的機制。

加上:

int prefetchcount = 1;

channel.basicqos(prefetchcount);

最終**:

public class newtask 

}public class worker

}public static void main(string args) throws exceptioncatch (interruptedexception e)finally

};boolean autoack = false;//true表示關閉訊息回執

channel.basicconsume(queue_name, autoack, delivercallback, consumertag -> );}}

rabbitmq學習筆記一

首先我們先看rabbitmq原理圖 exchange交換器 接受訊息和路由訊息,然後將訊息傳送給訊息佇列。對於每乙個虛擬主機內部,交換器有獨一無二的名字 應用程式在其許可權範圍之內可以自由建立 共享 使用和銷毀交換例項。持久交換器可以使持久的 臨時的 或者自動刪除的。持久直到顯式刪除時消失 臨時交換...

RabbitMQ學習筆記1

博主從事網路程式設計3年了,但是說來慚愧的是,工作中沒有使用過訊息佇列。所以呢,打算從今天開始系統學習一些訊息佇列相關的知識,部落格也就作為筆記了。記錄一下自己的一些理解過程,有不對之處希望各位指出。生產者 消費者與訊息佇列 首先呢,訊息佇列不生產資料,他只是乙個資訊的搬運工具。資料由生產者提供,經...

RabbitMQ學習筆記 1

rabbitmq的特性 開源 開發語言是erlang 平台和 商無關性 為幾乎全部開發語言提供了客戶端工具並能執行在所有主流計算機平台上 輕量級 執行核心功能以及諸如管理介面的外掛程式只需要不到40mb記憶體 面向大多數現代語言的客戶端開發庫 靈活控制訊息通訊的平衡性 效能與吞吐量平衡的靈活控制 高...