RabbitMQ持久化
阿新 • • 發佈:2022-04-01
如果我們希望即使在RabbitMQ服務重啟的情況下,也不會丟失訊息,我們可以將Queue與Message都設定為可持久化的(durable),訊息持久化後我們的訊息會儲存到我們的磁碟上,這樣可以保證絕大部分情況下我們的RabbitMQ訊息不會丟失。當然還是會有一些小概率事件會導致訊息丟失。
1.訊息佇列Queue的持久化
在我們建立佇列時,可進行設定
管理頁面上顯示這個D標識表示佇列持久化
但是這只是對佇列進行了持久化,並不能保證訊息在RabbitMQ伺服器重啟後仍然存在,所以其實還需要對訊息進行持久化
2.訊息Message的持久化
生產者在釋出訊息時對訊息屬性設定為MessageProperties.PERSISTENT_TEXT_PLAIN
注:紅色欄位
/** * 生產者 */ public class Send { //設定佇列名稱(已存在的佇列) private static final String QUEUE_NAME="queue1"; public static void main(String[] args) throws IOException, TimeoutException { //從MQ工具類獲取連線資訊 Connection connection = MqConnectionUtils.getConnection();//建立一個通道 Channel channel = connection.createChannel(); //準備傳送的訊息內容 String msg = "world"; //傳送訊息給佇列 /** * 引數1:交換機,不定義也會有預設的,因為我們的訊息是通過交換機來進行投遞給佇列的,所以交換機不可能沒有 * 引數2:簡單模式:佇列名稱 * 引數3:訊息的狀態控制 * 引數4:訊息內容 */ channel.basicPublish("",QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes()); System.out.print("傳送成功"); //關閉通道 channel.close(); connection.close(); } }
但是其實將訊息標記為持久化也並不能完全保證不會丟失訊息。儘管它告訴RabbitMQ將訊息儲存到磁碟上,但這裡依然會存在訊息丟失的可能,這裡就涉及到了RabbitMQ訊息確認機制