重慶市建設(shè)工程信息網(wǎng)聯(lián)系電話自動seo系統(tǒng)
默認情況下,exchange、queue、message 等數(shù)據(jù)都是存儲在內(nèi)存中的,這意味著如果 RabbitMQ 重啟、關(guān)閉、宕機時所有的信息都將丟失。
RabbitMQ 提供了持久化來解決這個問題,持久化后,如果 RabbitMQ 發(fā)送 重啟、關(guān)閉、宕機,下次起到時 RabbitMQ 會從硬盤中恢復(fù)exchange、queue、message 等數(shù)據(jù)。
1.隊列持久化
隊列的持久化是在聲明隊列時指定的
channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);
如下圖聲明隊列的方法中如果設(shè)置 durable為false 時,表示不進行持久化
如下圖中存在D標識的表示持久化隊列,沒有D表示的是非持久化隊列
注意:
-
如果之前聲明的隊列不是持久化的,需要把原先隊列先刪除,或者重新創(chuàng)建一個持久化的隊列。否則會出現(xiàn)如下錯誤
-
設(shè)置持久化的隊列即使RabbitMQ 重啟、宕機了,也依然存在,沒有進行持久化的隊列當RabbitMQ 重啟、宕機后就不存在了
把隊列設(shè)置持久化具體代碼如下
public class Task02 {//隊列名稱public static final String TASK_QUEUE_NAME = "ACK_QUEUE1";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = RabbitMQUtils.getChannel();//聲明隊列channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);//在控制臺中輸入信息Scanner scanner = new Scanner(System.in);System.out.println("請輸入信息:");while (scanner.hasNext()) {String message = scanner.next();channel.basicPublish("", TASK_QUEUE_NAME, null, message.getBytes("UTF-8"));System.out.println("生產(chǎn)者發(fā)出消息:" + message);}}
}
2.消息持久化
和queue一樣,message也是存儲在內(nèi)存中的,這意味著如果 RabbitMQ 重啟、關(guān)閉、宕機時所有的信息都將丟失,因此需要將消息進行持久化;
因此需要在消息發(fā)布時對消息進行持久化
channel.basicPublish("",TASK_QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));
消息持久化完整代碼如下
public class Task02 {//隊列名稱public static final String TASK_QUEUE_NAME = "ACK_QUEUE1";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = RabbitMQUtils.getChannel();//聲明隊列channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);//在控制臺中輸入信息Scanner scanner = new Scanner(System.in);System.out.println("請輸入信息:");while (scanner.hasNext()) {String message = scanner.next();channel.basicPublish("", TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes("UTF-8"));System.out.println("生產(chǎn)者發(fā)出消息:" + message);}}
}
注意:
- 將消息標記為持久化并不能完全保證不會丟失消息。當RabbitMQ 將消息保存到磁盤,但是還沒有存儲完,出現(xiàn)了故障,此時就會出現(xiàn)數(shù)據(jù)丟失的情況;