rabbitmq的队列和消息持久化

rabbitmq的持久化

1、rabbitmq队列开启持久化

1. 需要在声明时开启durable(持久的)

//声明队列
        boolean durable = true;//是否开启持久化
        channel.queueDeclare(QUEUE_NAME,durable,false,false,null);

2. 测试未开启持久化重启rabbitmq

我们发现所有的队列都没了

3. 重新发送队列

D标志是我们使用了队列持久化的 继续重启rabbitmq

我们发现除了持久化的队列其他都没了,但是他自己本身的消息却没有存下来

2、队列消息持久化

  1. 我们使用的是channel.basicPublish发送消息,我们查看源码

其中关键就是第三个参数,BasicProperties,我们打开它

deliveryMode=1代表不持久化,deliveryMode=2代表持久化

  1. 我们使用MessageProperties.PERSISTENT_TEXT_PLAIN开启消息持久化

MessageProperties.PERSISTENT_TEXT_PLAIN默认设置了deliveryMode=2

channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());

  1. 也可以使用
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
AMQP.BasicProperties properties = builder.build();
channel.basicPublish("", QUEUE_NAME, properties, msg.getBytes());

原因:

3、交换机的持久化

  1. 在我们使用发布订阅的模式中,如果队列和消息都是持久化的,而交换机却不是持久化的
  2. 经过实验发现,模拟服务器死机之后重启生成者将无法发送消息给队列
  3. 因为交换机已经不存在了,所以我们得给交换机也实现持久化
//声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout", true);//开启持久化的交换机
        //详细代码参考订阅模式
经验分享 程序员 微信小程序 职场和发展