【问题标题】:How to achieve at-least-once delivery guarantee with RabbitMQ and Spring AMQP without using transactions?如何在不使用事务的情况下使用 RabbitMQ 和 Spring AMQP 实现至少一次交付保证?
【发布时间】:2018-06-13 14:56:24
【问题描述】:
【问题讨论】:
标签:
rabbitmq
spring-rabbit
【解决方案1】:
您需要向 rabbit 模板(自定义模板或引导配置的模板)添加确认回调以获取确认。您可以将相关数据添加到消息发送中,以便将确认与发送相关联。
见the documentation。
对于发布者确认(又名发布者确认),模板需要将其 publisherConfirms 属性设置为 true 的 CachingConnectionFactory。通过调用 setConfirmCallback(ConfirmCallback callback) 注册 RabbitTemplate.ConfirmCallback 将确认发送到客户端。回调必须实现这个方法:
void confirm(CorrelationData correlationData, boolean ack, String cause);
CorrelationData 是客户端在发送原始消息时提供的对象。 ack 对于 ack 为 true,对于 nack 为 false。对于 nack ,如果在生成 nack 时可用,则 cause 可能包含 nack 的原因。一个例子是向不存在的交换机发送消息时。在这种情况下,经纪人关闭通道;关闭的原因包含在原因中。原因是在 1.4 版本中添加的。
RabbitTemplate 仅支持一个 ConfirmCallback。