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