
1.消息可靠性问题(实现消费者确认)
1.在项目中添加配置

logging:
pattern:
dateformat: HH:mm:ss:SSS
level:
cn.itcast: debug
spring:
rabbitmq:
host: 192.168.2.182 # rabbitMQ的ip地址
port: 5672 # 端口
username: root
password: root
virtual-host: /
publisher-confirm-type: correlated
publisher-returns: true
template:
mandatory: true
2.编写returnCallback

3.编写ComfirmCallback

2.消息持久化
可视化界面创建队列的可持久化

代码中的持久化(默认即为持久化)

@Configuration
public class CommonConfig {
@Bean//创建交换机
public DirectExchange simpleDirect(){
return new DirectExchange("simple.direct",true,false);
}
@Bean //创建队列
public Queue simoleQueue(){
return QueueBuilder.durable("simple.queue").build();
}
}
@Test
public void testDurableMessage(){
//1.准备消息
Message message = MessageBuilder.withBody("hello,spring".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();
//发送消息
rabbitTemplate.convertAndSend("simple.queue",message);
}
消费者消息确认机制


消费者失败重试


实现代码
面试常问:

死信交换机


TTL实现流程


延迟队列

![]()
安装DelayExchange插件(基于centos7)
官方下载地址:Community Plugins — RabbitMQ
使用命令查看rabbitmq的挂载地址
docker volume inspect mq-plugins

将下载的插件放在插件所在位置
进入容器内部
docker exec -it mq bash
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
基本使用

延迟时间由发送信息的时候设定
使用java代码实现创建延迟队列
创建交换机


发送消息

防止延迟队列被当成错误解决
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//获取rabbitTemplate
RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
//配置returncallback
rabbitTemplate.setReturnCallback((message, replayCode, replyText, exchange, routingKey) -> {
if (message.getMessageProperties().getReceivedDelay()>0) {
return;
}
//记录日志
log.error(
"消息发送到队列失败,响应码:{},失败原因:{},交换机:{},路由key:{},消息:{}",
replayCode, replyText, exchange, routingKey,message.toString());
});
}
}
消息堆积问题

惰性队列

将一个普通对列变为惰性队列

在声明队列时







![[Golang] 设计模式以及单例设计模式实例实现](https://img-blog.csdnimg.cn/290cb82ff7834878aff2daa6c4a0bf4f.gif#pic_center)












