计算机系统应用教程网站

网站首页 > 技术文章 正文

RabbitMQ持久化 rabbitmq持久化默认保留15天吗

btikc 2024-10-02 12:20:11 技术文章 12 ℃ 0 评论

RabbitMQ 支持消息的持久化,以确保在 RabbitMQ 重启或发生故障时,消息不会丢失。要实现消息持久化,需要做两件事情:

  1. 将队列标记为持久化:这需要在声明队列时指定 durable 参数为 true。
  2. 将消息标记为持久化:这需要在发送消息时,将消息的 DeliveryMode 设置为 2(持久化)。

存储模式

RabbitMQ 使用一种称为 mirror queue 的机制来实现队列的高可用性。这种机制允许队列的内容在多个节点之间进行镜像,从而在节点发生故障时,其他节点可以接管工作,确保服务的连续性。

代码示例

以下是使用 Spring Boot 和 RabbitMQ 实现消息持久化的示例代码:

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitConfig {

    @Bean
    public Queue myDurableQueue() {
        return new Queue("myDurableQueue", true); // 队列持久化
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setChannelTransacted(true); // 开启事务
        return template;
    }

    @Bean
    public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("myDurableQueue");
        container.setMessageListener(new MessageListenerAdapter(new RabbitListener()));
        return container;
    }
}

public class RabbitListener {

    public void handleMessage(String message) {
        System.out.println("Received message: " + message);
    }
}

在发送消息时,确保消息是持久化的:

rabbitTemplate.convertAndSend("myDurableQueue", message, message1 -> {
    message1.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
    return message1;
});

通过以上设置,可以确保在 RabbitMQ 中消息即使在发生故障的情况下也不会丢失。不过,需要注意的是,消息持久化会带来性能上的开销,因此在使用时需要根据实际需求进行权衡。

#以书之名#?

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表