前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >RabbitMQ是如何确定消息是否投递到队列中的

RabbitMQ是如何确定消息是否投递到队列中的

作者头像
码农小胖哥
发布于 2020-10-10 02:24:51
发布于 2020-10-10 02:24:51
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

1. 前言

在使用RabbitMQ消息中间件时,因为消息的投递是异步的,默认情况下,RabbitMQ会删除那些无法路由的消息。为了能够检出消息是否顺利投递到队列,我们需要相应的处理机制。今天就来验证一下相关的验证机制。

2. 消息投递失败

那么哪些情况消息会投递失败呢?RabbitMQ消息会先到达指定的交换机,然后由交换机路由到对应的队列。所以以下几种情况会导致消息投递失败。

  • 投递的交换机不可用。
  • 投递的交换机可用,但是没有匹配到队列。

3. 投递失败的处理机制

对应上面的两种情况,RabbitMQ提供了对应的解决方案。

ConfirmCallback

RabbitMQ提供了ConfirmCallback接口用于实现消息发送到RabbitMQ交换器后进行确认回调。

Spring Boot中需要开启:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  rabbitmq:
  # 通常选择 correlated
    publisher-confirm-type:

通常有三种选择:

  • NONE ,禁用发布确认模式,是默认值。
  • CORRELATED,发布消息时会携带一个CorrelationData,被ack/nackCorrelationData会被返回进行对照处理,CorrelationData可以包含比较丰富的元信息进行回调逻辑的处理。
  • SIMPLE,当被ack/nack后会等待所有消息被发布,如果超时会触发异常,甚至关闭连接通道。

这里我使用CORRELATED模式,声明一个ConfirmCallback并设置到RabbitTemplate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
    // correlationData 可能为空
    if (ack) {
        log.debug("消息发送到exchange成功,id: {}", correlationData.getId());
    } else {
        log.debug("消息发送到exchange失败,原因: {}", cause);
    }
});

当消息投递到一个不存在的交换机Exchangeack=false时会输出日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Publishing message [(Body:'"hello"' MessageProperties [headers={spring_listener_return_correlation=a088eb3f-a234-4e15-bb7a-3aa9a6f043e6, spring_returned_message_correlation=29975bc1-f363-4e3a-85ca-010d13888720, __TypeId__=java.lang.String}, contentType=application/json, contentEncoding=UTF-8, contentLength=7, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])] on exchange [DIRECT_EXCHANGE1], routingKey = [DIRECT_ROUTING_KEY2]

- 消息发送到exchange失败,原因: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'DIRECT_EXCHANGE1' in vhost 'my_vhost', class-id=60, method-id=40)

这里实现的比较简单你可以增加一些消息投递到交换机失败后的操作处理逻辑。

ReturnCallback

ReturnCallback接口用于实现消息已经成功发送到RabbitMQ交换机,但没有匹配到队列时的回调。

Spring Boot中需要同时开启:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  rabbitmq:
    publisher-returns: true
    template:
      mandatory: true

RabbitTemplate中的mandatory设置值优先级要高一些。

我们声明一个ReturnCallback并设置到RabbitTemplate

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
    String correlationId = message.getMessageProperties()
            .getHeader(PublisherCallbackChannel.RETURNED_MESSAGE_CORRELATION_KEY);
    log.debug("消息:{} 发送失败, 应答码:{} 原因:{} 交换机: {}  路由键: {}", correlationId,
            replyCode, replyText, exchange, routingKey);
});

当消息成功投递到交换机但是无法匹配到队列时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- Publishing message [(Body:'"hello"' MessageProperties [headers={spring_listener_return_correlation=155648bd-fc3e-4c8b-a650-7b1ce720c7a6, spring_returned_message_correlation=7029ee49-357a-42fc-8532-dc41b4bb8e87, __TypeId__=java.lang.String}, contentType=application/json, contentEncoding=UTF-8, contentLength=7, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])] on exchange [DIRECT_EXCHANGE], routingKey = [DIRECT_ROUTING_KEY2]

- 消息:7029ee49-357a-42fc-8532-dc41b4bb8e87 发送失败, 应答码:312 原因:NO_ROUTE 交换机: DIRECT_EXCHANGE  路由键: DIRECT_ROUTING_KEY2
- 消息发送到exchange成功,id: 7029ee49-357a-42fc-8532-dc41b4bb8e87

从上面我们也可以看出ReturnCallback只处理投递到队列失败的情况,并不像ConfirmCallback既能处理失败的情况也能处理成功的情况。

4. 总结

消息投递失败的处理在使用RabbitMQ的使用中时非常必要的,能够帮助我们追踪消息的投递情况,以及处理消息投递异常或者成功后的逻辑处理,为消息丢失进行一些兜底或者记录。但是请注意这个并不是发生在消费阶段,是否成功消费并不是由这两种回调来处理,我们有空再对消息的消费确认进行讲解。多多关注:码农小胖哥 获取更多的编程干货。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农小胖哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
8.9 Selenium元素定位方式
元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素象。webdriver提供了一系列的对象定位方法,常用的有以下几种:
清风穆云
2021/08/09
1.4K0
selenium自动化测试报告_selenium自动化测试断言
注意:driver.close() ,当前关闭的是主窗口,只有完成页面切换才可以关闭当前新的页面
全栈程序员站长
2022/11/15
2.6K0
selenium自动化测试报告_selenium自动化测试断言
Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
判断button是否显示,和is_displayed()容易混淆的是is_enabled()。
软件测试君
2022/12/05
1K0
Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
探索自动化测试工具:Selenium的威力与应用
Selenium可以在多种主流浏览器中运行,包括Chrome、Firefox、Edge等。这使得开发人员可以确保他们的Web应用程序在各种浏览器中都能正常运行。
小馒头学Python
2023/11/30
8570
探索自动化测试工具:Selenium的威力与应用
【Python爬虫实战】Selenium自动化网页操作入门指南
在现代网络开发和数据爬取中,Selenium 已成为不可或缺的自动化工具之一。无论是用于测试、数据抓取,还是模拟用户行为,Selenium 都可以在不干预的情况下自动化浏览器操作,为开发者节省大量时间和精力。本指南将带您从 Selenium 的安装配置到高级操作,逐步掌握网页自动化的核心技巧。
易辰君
2024/11/07
1.3K0
彻底学会Selenium元素定位
最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总是定位不到元素,以及不知道用哪种定位方式更好。
测试蔡坨坨
2022/12/21
7.8K0
彻底学会Selenium元素定位
大模型开发实战:(一)使用 Selenium 进行网页爬虫
Selenium 由 Jason Huggins 于 2004 年发起,最初名为 JavaScript Testing Framework,后因受到希腊神话中“月亮女神 Selene”的启发而更名为 Selenium。它最初是为了解决网页自动化测试需求而诞生的开源工具,但因其能模拟真实浏览器操作(如点击、输入、滚动等),也被广泛用于网页数据爬取。爬虫工具有很多,例如 BeautifulSoup4,为什么选择自动化测试工具 Selenium 进行爬虫?目前绝大部分 Web 应用都使用 JavaScrip 动态加载数据,而 BeautifulSoup4 只能解析初始页面的 HTML 源码,对于动态加载的数据无法获取,因此使用 Selenium 模拟用户,完成数据加载的操作。
张高兴
2025/05/21
5520
大模型开发实战:(一)使用 Selenium 进行网页爬虫
Python爬虫(二十一)_Selenium与PhantomJS
本章将介绍使用Selenium和PhantomJS两种工具用来加载动态数据,更多内容请参考:Python学习指南 Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。 Selenium可以根据我们的指令,让浏览器自动加载页面,获取需要的页面,甚至页面截屏,或
用户1174963
2018/01/17
2.8K0
Python爬虫(二十一)_Selenium与PhantomJS
全网最全关于selenium webdriver 8大元素定位详解
元素的定位应该是自动化测试的核心,想要操作一个元素,首先应该识别这个元素。Webdriver提供了一系列的元素定位方法。
全栈程序员站长
2022/06/29
1.9K0
全网最全关于selenium webdriver 8大元素定位详解
自动化测试——selenium(环境部署和元素定位篇)
一、什么是selenium? > 一个web自动化测试工具; 二、主流的自动化工具: > QTP:收费 支持(支持web、桌面软件自动化) > selenium:免费,开源 只支持web项目 > Robot frameword: 基于Python扩展关 键字驱动自动化工具 注意:要是用selenium自动化工具,要先下载安装selenium 一、web自动化环境部署 1.1 selenium安装 1、安装 在cmd 直接输入 :pip install selenium 2、卸载: 在cmd输入:pip uninstall selenium 3、查看: pip show selenium 或者 pip list pip 是python中包管理工具(可安装,可卸载,查看python工具),使用pip的时候必须联网 有的输入 pip install selenium 会提示出现 ‘pip’ 不是内部或外部命令,也 不是可运行的程序或批处理文件。产生这个原因python环境内部没有 pip 路径,则需要我们收到导入 解决方法: 1、找到我们python工具中的pip所在文件夹,复制其路径
伤心的辣条
2022/09/08
2.2K0
自动化测试——selenium(环境部署和元素定位篇)
Selenium工具学习
他是基于XML(标记语言)、Path的简称, 他是一种在xml文档中查找元素信息的语言。
用户11097514
2024/05/30
1720
Selenium工具学习
【Python爬虫实战】深入解析 Selenium:从元素定位到节点交互的完整自动化指南
Selenium 是进行网页自动化操作的强大工具,在测试、数据抓取、用户行为模拟等领域广泛应用。本指南将带您详细了解如何在 Selenium 中查找和定位页面元素,并深入介绍各种节点交互方法,包括点击、输入文本、选择选项等操作。无论您是初学者还是经验丰富的开发者,本篇文章将帮助您掌握 Selenium 自动化的核心技能,实现更高效的网页自动化操作。
易辰君
2024/11/07
8760
Selenium 4 有哪些不一样?
众所周知,Selenium在2021年10月13号发布了Selenium4,目前最新的版本应该是Selenium 4.4.0。
测试蔡坨坨
2022/08/28
2K0
Selenium 4 有哪些不一样?
Selenium3元素定位详解与封装
在学习自动化测试之前,首先需要思考清楚的是为什么需要学习自动化测试,以及今天业界谈的研发效能对测试而言意味着什么?其实这就需要在测试以及整体研发的角度来思考问题,在今天这样的市场环境中,打造高质量的持续交付产品质量,基本是所有互联网研发团队的测试团队都追求的一个方向。在敏捷流行的今天,以及新的技术在企业全面的落地,在测试而言,就需要通过测试技术的手段以及质量管理的思维能力,来提升测试效率,和交付满足市场期待的产品质量。自动化测试是所有测试形式里面在目前而言,是最基础的也是最核心的,因为自动化测试连接了功能测试以及高阶的测试开发的测试技术栈的知识体系。即使初级的测试同学,也得具备自动化测试的思维能力和技术能力。
无涯WuYa
2021/10/13
9800
Selenium3元素定位详解与封装
自动化测试工具Selenium的基本使用方法
由于requests模块是一个不完全模拟浏览器行为的模块,只能爬取到网页的HTML文档信息,无法解析和执行CSS、JavaScript代码,因此需要我们做人为判断;
江一铭
2022/06/17
2.7K0
《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)
  “压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目。在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区。“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个,倒数第一个节目称“压台”。想看“压台篇”,敬请关注宏哥
北京-宏哥
2019/12/10
1.4K0
《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)
自动化-Selenium 3-常用API(Python版)
ActionChains类提供的鼠标事件常用方法(perform()执行所有ActionChains中存储的行为):
wangmcn
2022/07/22
1.4K0
自动化-Selenium 3-常用API(Python版)
ChatGPT与基于GUI的自动化测试
当使用Edge浏览器结合Selenium框架生成百度查询测试代码时,你可以使用以下Python代码示例:
顾翔
2024/09/10
2260
ChatGPT与基于GUI的自动化测试
selenium最大化浏览器-Web UI自动化测试之Selenium工具篇
  注意:3.0 版本下所有浏览器除了需要安装 框架 以外,还需要安装对应的驱动程序
宜轩
2022/12/26
2K0
爬虫最终杀手锏 — PhantomJS 详解(附案例)
Selenium: 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 Phantomjs 的工具代替真实的浏览器。
全栈程序员站长
2022/09/06
2.4K0
推荐阅读
相关推荐
8.9 Selenium元素定位方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档