当 RabbitMQ 服务停掉以后,消息生产者发送过来的消息不丢失要如何保障?默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事:我们需要将队列和消息都标记为持久化。
#队列持久化
之前我们创建的队列都是非持久化的,RabbitMQ 如果重启的化,该队列就会被删除掉,如果要队列实现持久化需要在声明队列的时候把 durable 参数设置为true,代表开启持久化
在消息生产者开启持久化:
public class Task02 {
//队列名称
public static final String TASK_QUEUE_NAME = "ACK_QUEUE";
public static void main(String[] args) throws IOException, TimeoutException {
Channel channel = RabbitMQUtils.getChannel();
//开启持久化
boolean durable = true;
//声明队列
channel.queueDeclare(TASK_QUEUE_NAME,durable,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("生产者发出消息:"+ message);
}
}
}
注意
如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新创建一个持久化的队列
不然就会出现如下错误: