RabbitMQ 消息持久化

默认情况下,exchange、queue、message 等数据都是存储在内存中的,这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。

RabbitMQ 提供了持久化来解决这个问题,持久化后,如果 RabbitMQ 发送 重启、关闭、宕机,下次起到时 RabbitMQ 会从硬盘中恢复exchange、queue、message 等数据。

1.队列持久化

队列的持久化是在声明队列时指定的

channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);

如下图声明队列的方法中如果设置 durable为false 时,表示不进行持久化

image-20230710221158738

如下图中存在D标识的表示持久化队列,没有D表示的是非持久化队列

image-20230710221727375

注意:

  • 如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新创建一个持久化的队列。否则会出现如下错误

    image-20230710221936964

  • 设置持久化的队列即使RabbitMQ 重启、宕机了,也依然存在,没有进行持久化的队列当RabbitMQ 重启、宕机后就不存在了

把队列设置持久化具体代码如下

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("生产者发出消息:" + message);
        }
    }
}

2.消息持久化

和queue一样,message也是存储在内存中的,这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失,因此需要将消息进行持久化;

因此需要在消息发布时对消息进行持久化

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("生产者发出消息:" + message);
        }

    }
}

注意:

  • 将消息标记为持久化并不能完全保证不会丢失消息。当RabbitMQ 将消息保存到磁盘,但是还没有存储完,出现了故障,此时就会出现数据丢失的情况;

相关推荐

  1. RabbitMQ-数据持久

    2023-12-19 00:58:02       34 阅读
  2. 异步解耦之RabbitMQ(四)_消息持久及ACK机制

    2023-12-19 00:58:02       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-19 00:58:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-19 00:58:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-19 00:58:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-19 00:58:02       20 阅读

热门阅读

  1. 前后端传参格式

    2023-12-19 00:58:02       37 阅读
  2. 低代码冲击带来的影响

    2023-12-19 00:58:02       43 阅读
  3. Windows Hypervisor Platform魔改版Unicorn Engine

    2023-12-19 00:58:02       38 阅读
  4. 深度学习epoch、psnr、epoch、step解释

    2023-12-19 00:58:02       35 阅读