RabbitMQ持久化

如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),消息持久化后我们的消息会保存到我们的磁盘上,这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。


 1.消息队列Queue的持久化

在我们创建队列时,可进行设置

管理页面上显示这个D标识表示队列持久化

但是这只是对队列进行了持久化,并不能保证消息在RabbitMQ服务器重启后仍然存在,所以其实还需要对消息进行持久化

2.消息Message的持久化

生产者在发布消息时对消息属性设置为MessageProperties.PERSISTENT_TEXT_PLAIN就可以将消息进行持久化

注:红色字段

/**
 * 生产者
 */
public class Send {
    //设定队列名称(已存在的队列)
    private static final String QUEUE_NAME="queue1";

    public static void main(String[] args) throws IOException, TimeoutException {
        //从MQ工具类获取连接信息
        Connection connection = MqConnectionUtils.getConnection();
        //创建一个通道
        Channel channel = connection.createChannel();
      //准备发送的消息内容
        String msg = "world";
     //发送消息给队列
      /**
       * 参数1:交换机,不定义也会有默认的,因为我们的消息是通过交换机来进行投递给队列的,所以交换机不可能没有
       * 参数2:简单模式:队列名称
       * 参数3:消息的状态控制
       * 参数4:消息内容
       */
        channel.basicPublish("",QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes());
        System.out.print("发送成功");
        //关闭通道
        channel.close();
        connection.close();
    }
}

但是其实将消息标记为持久化也并不能完全保证不会丢失消息。尽管它告诉RabbitMQ将消息保存到磁盘上,但这里依然会存在消息丢失的可能,这里就涉及到了RabbitMQ消息确认机制

 

posted @ 2022-04-01 16:35  RFAA  阅读(814)  评论(0编辑  收藏  举报