问题描述
我创建了一个 SpringBoot/Spring AMQP 项目,在其中我在 RabbitMQ 队列上配置了一个侦听器。问题:有什么办法可以把消息留在队列中?让我解释一下:我使用消息并做一些事情(例如保存在数据库上),如果出现问题,我希望能够重新使用消息。
提前致谢
解决方法
您需要考虑使用事务配置您的侦听器容器,因此当数据库调用失败时,事务将回滚并且不会在 RabbitMQ 上确认 AMQP 消息。
查看文档了解更多信息:https://docs.spring.io/spring-amqp/docs/current/reference/html/#transactions
,我不知道实现此目的的“Spring”方式,但您所描述的是 AMQP 消费者不会自动确认的正常行为。
在自动确认模式下,消息在发送后立即被视为成功投递。
当您关闭自动确认时,您的消费者必须明确确认该消息,否则它不会出列(或者如您所说,它将留在“队列中”)。然后,当您确定操作成功(并且可能与数据库事务协调)时,您需要在操作的最后简单地确认消息。
首先要做什么总是一个问题;先确认还是先提交数据库事务?在不增加复杂性的情况下,您必须根据哪种故障模式对您的问题较少来选择最好的,即您愿意容忍重复的消息还是丢失的消息?