type
status
date
slug
summary
tags
category
icon
password
如果发生RabbitMQ 重启,在重启期间生产者投递消息失败,导致消息丢失,需要手动处理和恢复。那怎么保证在重启的时候消息不会丢失呢?
把未成功的消息放入缓存中,通过定时任务,继续发送

image-20230620103749116
两种情况:交换机或者队列接不到消息。
正常情况生产者和消费者代码
交换机队列绑定
消费者
生产者
交换机接不到消息
回调接口
生产者发送消息,如果交换机无法接收到消息,那么会触发回调接口。
代码
在配置文件当中需要添加
spring.rabbitmq.publisher-confirm-type=correlated
- NONE
禁用发布确认模式,是默认值
- CORRELATED
发布消息成功到交换器后会触发回调方法
- SIMPLE
单个确认
结果
可以看到交换机可以打印回调消息

image-20230620145602772
交换机接收不到消息的情况
修改交换机名称

结果
可以看到接收到了回调,并且打印了错误信息

image-20230620150405518
队列接收不到消息
只需要把RoutingKey 改为错误的

image-20230620150800377
结果
可以看到,交换机应答说接收到消息了,但是队列没有接收到消息,消费者也就没有接收到消息。这种方法不适用于队列接收不到的情况,队列接收不到消息,生产者并不知道,这样谈何放缓存里呢。

image-20230620150732049
回退消息
如果该消息发出去之后发现不可路由,那么消息会被直接丢弃,需要设置一个参数,可以把不可路由的消息回退回来。
设置参数
实现接口

image-20230620153717179
重写方法
注入到 RabbitMQ
结果

image-20230620153621707