一、概念
为了保障当RabbitMQ服务停掉以后消息生产者发送过来的消息不丢失,我们需要将队列和消息都标记为持久化。默认情况下RabbitMQ退出或由于某种原因崩溃时,它忽视队列和消息。
二、队列持久化
实现队列持久化,需要在声明队列的时候把durable参数设置为持久化。
package com.example.rabbitmq.four;
import com.example.rabbitmq.rabbitMqUtils.RabbitUtils;
import com.rabbitmq.client.Channel;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;
public class Task4 {
// 队列名称
public static final String TASK_QUEUE_NAME = "ack_queue";
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitUtils.getChannel();
/*
* 生成一个队列
* 1、队列名称
* 2、队列里面的消息是否持久化(磁盘)默认情况消息存储在内存中
* 3、该队列是否共一个消费者进行消费,是否进行消息共享,true可以多个消费者消费,false只能一个消费者消费
* 4、是否自动删除,最后一个消费者断开链接后,该队列是否自动删除,true自动删除,false不自动删除
* 5、其它参数
* */
boolean durable = true;
channel.queueDeclare(TASK_QUEUE_NAME, durable, false, false, null);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String message = scanner.next();
/*
* 发送一个消息
* 1、发送到哪个交换机
* 2、路由key是哪个,本次是队列的名称
* 3、其他参数信息
* 4、发送消息的消息体
* */
channel.basicPublish("", TASK_QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println("消息发送完成......");
}
}
}
队列持久化后,就算rabbitmq重启了,该队列还是存在。
三、消息持久化
生产者发送消息的时候需要声明消息需要持久化。需要修改生产者代码,MessageProperties.PERSISTENT_TEXT_PLAIN。