微服务框架
【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
再次查看控制台
没问题,消息还在
这就是消息的持久化
【其实吧,默认都是持久的】