微服务框架
【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
服务异步通讯
文章目录
- 微服务框架
- 服务异步通讯
- 50 消息可靠性
- 50.2 消息持久化
- 50.2.1 消息持久化
50 消息可靠性
50.2 消息持久化
50.2.1 消息持久化
OK,我们已经实现了 生产者的消息确认,它可以 确保消息投递到RabbitMQ 的队列当中
但是这样消息就真的安全了 吗?
【不一定】
因为RabbitMQ 默认是内存存储,如果此时MQ 宕机了,消息也是有可能丢失 的
要想让消息真正安全,必须确保消息能够做到持久化,就是可以把它 写入到磁盘当中
【看个现象】

这是我们上次玩儿的那个队列,里面还有一条消息没有消费

现在重启一下 mq

OK
查看RabbitMQ 控制台

队列一个都没了 …

交换机还在
【原因】
仔细看

- durable:耐用的;持久的
意思就是如果想让队列 也可以持久化,带上这个东西
其实就是勾一下

这是通过控制台,代码如何做?
MQ默认是内存存储消息,开启持久化功能可以确保缓存在MQ中的消息不丢失。
- 交换机持久化:

这个之前就遇到过,但是老师没有深说, 现在来了,针不戳
试试,在消费者里面
package cn.itcast.mq.config;
import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CommonConfig {
@Bean
public DirectExchange simpleDirect(){
return new DirectExchange("simple.direct",true,false);
}
@Bean
public Queue simpleQueue(){
return QueueBuilder.durable("simple.queue").build();
}
}
OK,启动消费者,当然现在还没绑

OK, 查看控制台

OK,交换机和队列都创建 成功 了【而且都带了 D】
现在 把消费者停掉

在控制台向队列 发送一条消息


OK,消息发送成功
现在再次重启MQ

看看控制台

OK,队列还在,消息无了,说明消息还没实现持久化【看下面】
- 队列持久化:

- 消息持久化,SpringAMQP中的的消息默认是持久的,可以通过MessageProperties中的DeliveryMode来指定的:

试试,在生产者中新建测试方法
//发送持久消息
@Test
public void testDurableMessage() {
//1. 准备消息
Message message = MessageBuilder.withBody("Hello,DingJiaxiong".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.PERSISTENT)
.build();
//2. 发送消息
rabbitTemplate.convertAndSend("simple.queue",message);
}
直接运行

OK, 绿了
查看控制台

现在再次重启mq

OK
再次查看控制台

没问题,消息还在
这就是消息的持久化
【其实吧,默认都是持久的】

![[附源码]计算机毕业设计Python的黄河文化科普网站(程序+源码+LW文档)](https://img-blog.csdnimg.cn/3349fedd2d514c5da1cbfcb31676f0ed.png)





![[附源码]计算机毕业设计Python的网上点餐系统(程序+源码+LW文档)](https://img-blog.csdnimg.cn/ae379ac525664ab1b57deea86f5390a9.png)
![[附源码]计算机毕业设计Python的汽车租赁系统(程序+源码+LW文档)](https://img-blog.csdnimg.cn/ace89fafe29645d792bd5ef7fa886ff6.png)








