RabbitMQ 消息持久化

发布时间:2023年12月18日

默认情况下,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 将消息保存到磁盘,但是还没有存储完,出现了故障,此时就会出现数据丢失的情况;
文章来源:https://blog.csdn.net/qq_37606901/article/details/135044692
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。