交换机或队列无法接收消息
2025-4-20
| 2025-4-20
Words 825Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password
如果发生RabbitMQ 重启,在重启期间生产者投递消息失败,导致消息丢失,需要手动处理和恢复。那怎么保证在重启的时候消息不会丢失呢?
把未成功的消息放入缓存中,通过定时任务,继续发送
notion image
image-20230620103749116
两种情况:交换机或者队列接不到消息。

正常情况生产者和消费者代码

交换机队列绑定

消费者

生产者

交换机接不到消息

回调接口

生产者发送消息,如果交换机无法接收到消息,那么会触发回调接口。

代码

在配置文件当中需要添加

spring.rabbitmq.publisher-confirm-type=correlated
  • NONE
禁用发布确认模式,是默认值
  • CORRELATED
发布消息成功到交换器后会触发回调方法
  • SIMPLE
单个确认

结果

可以看到交换机可以打印回调消息
notion image
image-20230620145602772
交换机接收不到消息的情况
修改交换机名称
notion image

结果

可以看到接收到了回调,并且打印了错误信息
notion image
image-20230620150405518

队列接收不到消息

只需要把RoutingKey 改为错误的
notion image
image-20230620150800377

结果

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

回退消息

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

设置参数

实现接口

notion image
image-20230620153717179

重写方法

注入到 RabbitMQ

结果

notion image
image-20230620153621707
交替位二进制数交换机之Topics模式
Loading...