1.应答模式
RabbitMQ 中的消息应答模式主要包括两种:自动应答(Automatic Acknowledgement)和手动应答(Manual Acknowledgement)。
-
自动应答:
不在乎消费者对消息处理是否成功,都会告诉队列删除消息。如果处理消息失败,实现自动补偿(队列投递过去 重新处理)。
-
手动应答:
-
在手动应答模式下,消费者在接收到消息后并不会立即向RabbitMQ确认消息已处理完毕。消费者需要显式调用
basicAck方法来确认消息处理完成,RabbitMQ只有在接收到消费者的确认后才会将消息从队列中删除。 -
采用手动应答可以提高消息的可靠性,即使消费者在处理消息过程中出现问题,只要未发送ack确认,RabbitMQ会在重新连接后再次将消息发送给该消费者。
-
如果消费者在处理消息前断开了连接,或者在处理消息期间抛出了未捕获的异常,RabbitMQ会认为消息未被正确处理,从而重新排队消息,确保消息至少会被消费一次(at least once delivery)。

2.SpringBoot如何实现两种应答。
2.1自动应答
在Spring Boot的配置文件application.properties中,对于RabbitMQ监听器,设置自动应答模式:
# 自动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = auto
@Component
public class AutoAcknowledgementConsumer {
@RabbitListener(queues = "yourQueue")
public void consumeMessage(String message, Message amqpMessage) {
// 处理消息...
// 框架会在方法执行完成后自动发送ack确认消息
}
}

2.2 手动应答
首先,同样在配置文件中启用手动应答模式
# 手动应答模式
spring.rabbitmq.listener.simple.acknowledge-mode = manual
@Component
public class ManualAcknowledgementConsumer implements ChannelAwareMessageListener {
@Override
@RabbitListener(queues = "yourQueue")
public void onMessage(Message message, Channel channel) throws Exception {
try {
// 处理消息...
// 如果处理成功,手动发送ack确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
// 处理失败,可以选择重试或拒绝消息(basicNack或basicReject)
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); // 并重新入队
}
}
}
3.如何解决死循环?重试机制

#应答模式 手动应答需要开发者手动应答
spring.rabbitmq.listener.simple.acknowledge-mode=AUTO
#批量预抓取数量,提高执行效率
spring.rabbitmq.listener.simple.prefetch = 10
#开启消费者重试机制
spring.rabbitmq.listener.simple.retry.enabled = true
#重试的最大次数
spring.rabbitmq.listener.simple.retry.max-attempts = 6
#重试间隔时间
spring.rabbitmq.listener.simple.retry.initial-interval = 3000
#重试间隔倍数,默认值是1
spring.rabbitmq.listener.simple.retry.multiplier = 2
#最大间隔时间,默认值是10s
spring.rabbitmq.listener.simple.retry.max-interval = 15000
本文详细介绍了RabbitMQ中的自动应答(AutomaticAcknowledgement)和手动应答(ManualAcknowledgement)模式在SpringBoot中的应用,以及如何通过配置避免死循环问题,包括启用重试机制和调整相关参数。
2132

被折叠的 条评论
为什么被折叠?



