如果我們希望即使在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消息確認機制
