rabbitmq的持久化
1、rabbitmq队列开启持久化
1. 需要在声明时开启durable(持久的)
//声明队列
boolean durable = true;//是否开启持久化
channel.queueDeclare(QUEUE_NAME,durable,false,false,null);
2. 测试未开启持久化重启rabbitmq
我们发现所有的队列都没了
3. 重新发送队列
D标志是我们使用了队列持久化的
继续重启rabbitmq
我们发现除了持久化的队列其他都没了,但是他自己本身的消息却没有存下来
2、队列消息持久化
- 我们使用的是channel.basicPublish发送消息,我们查看源码
其中关键就是第三个参数,BasicProperties,我们打开它
deliveryMode=1
代表不持久化,deliveryMode=2
代表持久化
- 我们使用MessageProperties.PERSISTENT_TEXT_PLAIN开启消息持久化
MessageProperties.PERSISTENT_TEXT_PLAIN默认设置了deliveryMode=2
channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes());
- 也可以使用
AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
AMQP.BasicProperties properties = builder.build();
channel.basicPublish("", QUEUE_NAME, properties, msg.getBytes());
原因:
3、交换机的持久化
- 在我们使用发布订阅的模式中,如果队列和消息都是持久化的,而交换机却不是持久化的
- 经过实验发现,模拟服务器死机之后重启生成者将无法发送消息给队列
- 因为交换机已经不存在了,所以我们得给交换机也实现持久化
//声明交换机
channel.exchangeDeclare(EXCHANGE_NAME,"fanout", true);//开启持久化的交换机
//详细代码参考订阅模式