引入

在使用 RabbitMQ 的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制消息的投递可靠性模式。

  • confirm 确认模式
  • return 回退模式

一、confirm模式和Return模式

(1)概念:

  • confirm机制,消息的确认,是指生产者投递消息之后,如果Broker收到消息,则会给生产者一个应答,生产者能接收应答,用来确定这条消息是否正常的发送到Broker,这种机制是消息可靠性投递的核心保障。confirm机制是只保证消息到达exchange,并不保证消息可以路由到正确的queue。
  • return机制,用于处理一些不可路由的消息,在一些特殊的情况下,当前的exchange不存在或者指定的路由key路由不到,这时如果我们需要及时监听这种消息,就需要return机制。

(2)代码:
配置文件:

server.port=8080spring.rabbitmq.host=dev-mq.ttsingops.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=cddayuwen
spring.rabbitmq.password=cddayuwen@123
spring.rabbitmq.virtual-host=/cd
#发布者确认
spring.rabbitmq.publisher-confirm-type=correlated
#发布者到达确认
spring.rabbitmq.publisher-returns=truespring.rabbitmq.listener.type=simple#simple关闭自动ack,手动ack
spring.rabbitmq.listener.simple.acknowledge-mode=manual
### 开启重试机制
spring.rabbitmq.listener.simple.retry.enabled=true
#最大重试传递次数
spring.rabbitmq.listener.simple.retry.max-attempts=3
#第一次和第二次尝试传递消息的间隔时间 单位毫秒
spring.rabbitmq.listener.simple.retry.initial-interval=5000ms
#最大重试时间间隔,单位毫秒
spring.rabbitmq.listener.simple.retry.max-interval=300000ms
#应用前一次重试间隔的乘法器,multiplier默认为1
spring.rabbitmq.listener.simple.retry.multiplier=3
#以上配置的间隔0s  5s  15s  45s#重试次数超过上面的设置之后是否丢弃(消费者listener抛出异常,是否重回队列,默认true:重回队列, false为不重回队列(结合死信交换机))
spring.rabbitmq.listener.simple.default-requeue-rejected=true### 模板配置
##设置为 true 后 消费者在消息没有被路由到合适队列情况下会被return监听,而不会自动删除
spring.rabbitmq.template.mandatory=true

实现接口类:

@Component
@Slf4j
public class RabbitMQConfirmAndReturn implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {/*** confirm机制只保证消息到达exchange,不保证消息可以路由到正确的queue,如果exchange错误,就会触发confirm机制** @param correlationData* @param ack* @param cause*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (!ack) {log.error("rabbitmq confirm fail,cause:{}", cause);}}/*** Return 消息机制用于处理一个不可路由的消息。在某些情况下,如果我们在发送消息的时候,当前的 exchange 不存在或者指定路由 key 路由不到,这个时候我们需要监听这种不可达的消息* 就需要这种return机制 * @param message* @param replyCode* @param replyText* @param exchange* @param routingKey*/@Overridepublic void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {log.error("mq消息不可达,message:{},replyCode:{},replyText:{},exchange:{},routing:{}", message.toString(), replyCode, replyText, exchange, routingKey);String messageId = message.getMessageProperties().getMessageId();}
}

设置实体对象

/*** 设置返回回调和确认回调** @param connectionFactory* @return*/@BeanRabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,RabbitMQConfirmAndReturn rabbitMQConfirmAndReturn) {RabbitTemplate rabbitTemplate = new RabbitTemplate();rabbitTemplate.setConnectionFactory(connectionFactory);rabbitTemplate.setConfirmCallback(rabbitMQConfirmAndReturn);rabbitTemplate.setReturnCallback(rabbitMQConfirmAndReturn);//Mandatory为true时,消息通过交换器无法匹配到队列会返回给生产者,为false时匹配不到会直接被丢弃rabbitTemplate.setMandatory(true);rabbitTemplate.setMessageConverter(jsonMessageConverter());return rabbitTemplate;}

二、消息确认机制

ack指Acknowledge,确认。 表示消费端收到消息后的确认方式。

有三种确认方式:

  • 自动确认:acknowledge=“none”
  • 手动确认:acknowledge=“manual”
  • 根据异常情况确认:acknowledge=“auto”

其中自动确认是指,当消息一旦被Consumer接收到,则自动确认收到,并将相应 message 从 RabbitMQ的消息缓存中移除。但是在实际业务处理中,很可能消息接收到,业务处理出现异常,那么该消息就会丢失。如果设置了手动确认方式,则需要在业务处理成功后,调用channel.basicAck(),手动签收,如果出现异常,则调用channel.basicNack()方法,让其自动重新发送消息。

RabbitMQ学习笔记(四)-消息确认机制相关推荐

  1. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  2. RabbitMQ(八):SpringBoot 整合 RabbitMQ(三种消息确认机制以及消费端限流)

    说明 本文 SpringBoot 与 RabbitMQ 进行整合的时候,包含了三种消息的确认模式,如果查询详细的确认模式设置,请阅读:RabbitMQ的三种消息确认模式 同时消费端也采取了限流的措施, ...

  3. MQ 入门(四)—— 消息确认机制Ack

    一.ACK机制简介 ACK (Acknowledgement),即确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符.表示发来的数据已确认接收无误. JMS API中约定了Client端可以 ...

  4. RabbitMQ学习笔记:消息追踪Firehose功能详解

    在使用任何消息中间件的过程中,难免会出现消息异常丢失的情况.对于RabbitMQ而言,可能是生产者与Broker断开了连接并且没有任何重试机制:也可能是消费者在处理消息时发生了异常,不过却提前进行了a ...

  5. springboot + rabbitmq 用了消息确认机制,感觉掉坑里了

    最近部门号召大伙多组织一些技术分享会,说是要活跃公司的技术氛围,但早就看穿一切的我知道,这 T M 就是为了刷KPI.不过,话说回来这的确是件好事,与其开那些没味的扯皮会,多做技术交流还是很有助于个人 ...

  6. RabbitMQ之消息确认机制(事务+Confirm)

    概述 在使用RabbitMQ的时候,我们可以通过消息持久化操作来解决因为服务器的异常奔溃导致的消息丢失,除此之外我们还会遇到一个问题,当消息的发布者在将消息发送出去之后,消息到底有没有正确到达brok ...

  7. RabbitMQ消息确认机制

    文章目录 1. 事务机制 2. Confirm模式 2.1 生产者 2.1.1 普通Confirm模式 2.1.2 批量Confirm模式 2.1.3 异步Confirm模式 2.2 消费者 3. 其 ...

  8. RabbitMQ消息确认机制和消息重发机制

    一.机制 首先我们要知道一条消息的传递过程. 生产者 -> 交换机 ->  队列 我们的生产者生产消息,生产完成的消息发送到交换机,由交换机去把这个消息转发到对应的队列上.这其中我们可能在 ...

  9. rabbitmq消息确认机制及死信队列的使用

    关于rabbitmq的基本概念和相关的理论这里就不做过多介绍了,在之前的篇幅中有过相应的介绍,也可以查询一些资料详细了解一下rabbitmq的基础知识,下面要介绍的点主要包括两个方面, 1.rabbi ...

最新文章

  1. python对文件中的关键词查找替换,实现自动获取配置
  2. 白话详细解读(四)-----FCN
  3. windows配置gvim高效率编程(cc++)带自动补全代码
  4. java后端模拟http请求_Http请求后端
  5. minio 并发数_开源数据存储项目Minio:提供非结构化数据储存服务
  6. linux方面的杂谈
  7. 去黑边_Vegas pro 17导入的素材有黑边咋进行去除的3种方法
  8. mysql pmm安装_PMM 安装部署
  9. Python批量移动文件到指定目录
  10. 百钱买百鸡,​ 我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。​ 百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?
  11. Word中设置论文参考文献对齐方法
  12. 移动硬盘分区后数据还能恢复吗?
  13. 获取IE浏览器版本号
  14. conda与Anaconda
  15. 一键安装Win7正版系统 Win7镜像系统2022
  16. 【Python爬虫】下载微信公众号图片
  17. 一个ADC做多个按键扫描检测
  18. 【绘制】HTML5 Canvas 中渐变色和图案(图文、示例)
  19. 关于RC电路耦合、相移、滤波、微分、积分的那些事儿~
  20. springboot2.x+dubbo2.x+seata1.x AT+nacos+zk实现分布式事务

热门文章

  1. Github每日精选(第48期):SQLite下的知识库memos
  2. 网络安全行业常见的权威职业证书有哪些?
  3. 基于小波分析与深度学习的脑电信号分类(matlab)
  4. 市场调研-前交叉韧带(ACL)重建市场现状及未来发展趋势
  5. k8s pod 详述
  6. AI 沦为炒作的工具?
  7. Elasticsearch外网无法通过ip访问
  8. 日语学习的实用网址大全
  9. 请让我像亲人一样爱你
  10. 阅读整理笔记,正能量