544、RabbitMQ详细入门教程系列 -【手动消费确认】 2022.09.05
目录
- 一、前言概述
- 二、配置实现
- 2.1 XML配置
- 2.2 MessageListener实现
- 三、消息预取
- 四、并发消费
- 五、参考链接
一、前言概述
RabbitMQ(四) --消费者Consumer一文中详细讲解了MQ消息消费的相关问题,在SpringAMQP中基本都会选择针对Connetion配置队列的监听器进行消息消费。配置默认的监听实例类SimpleMessageListenerContainer中对于消息消费的确认默认为autoAck,接下来本文将围绕手动ACK讲述
二、配置实现
2.1 XML配置
首先需要做的就是在消费监听中配置属性acknowledge为manual表示手动确认,然后就是在属性ref中配置MessageListener的实现
<!--配置消费者监听--><rabbit:listener-container connection-factory="cacheConnectionFactory" message-converter="jackson2JsonMessageConvert"acknowledge="manual"><rabbit:listener id="jjDeadBaseQueueListener" queues="jjDeadBaseQueue" ref="jjConsumerListener"/></rabbit:listener-container>
2.2 MessageListener实现
ChannelAwareMessageListener是SpringAMQP中封装提供的一个可以实现手动确认的接口,相对于默认的MessageListener接口多了一个返回参数channel,通过该信道参数就可以完成手动ACK的研发。如果有关消息确认方面的问题可以跳转到另外一篇文章RabbitMQ(四) --消费者Consumer
/*** @author zsl* @version 1.0.0* @date: 2020/5/11 14:24**/
@Component
public class JjConsumerListener implements ChannelAwareMessageListener {@Overridepublic void onMessage (Message message, Channel channel) throws Exception {// 消息byte[] body = message.getBody();// 确认IDlong deliveryTag = message.getMessageProperties().getDeliveryTag();// 信道确认channel.basicAck(deliveryTag,false);}}
三、消息预取
消费端每次访问RabbitMQ取出一条消息?这明显是不机智的设计,前面的文章也提到过这样的网络访问消耗是巨大的。所以有消息预取的概念,在SpringAMQP中如果没有限制那么将会是250数量消息的预取,假设这时消息体较大取到程序内存中,那就是自我炸裂。所以针对消息情况进行该参数控制很有必要
在MessageListener中进行配置,具体如下所示:配置参数prefetch
<rabbit:listener-container connection-factory="cacheConnectionFactory" message-converter="jackson2JsonMessageConvert"acknowledge="manual" prefetch="10"><rabbit:listener id="jjDeadBaseQueueListener" queues="jjDeadBaseQueue" ref="jjConsumerListener"/></rabbit:listener-container>
这时再通过监控WEB端可以看到其预取数量变为设置的数量10
四、并发消费
消息的积压大家都遇到过,消费者消息消费的速度跟不上生产者速度就会导致消息积压,对于很多消息及时性场景来讲都是不能接受的。所以SpringAMQP中提供并发消费的配置,如下所示:没有配置消费者数量时默认都是只有一个消费者
再上控制WEB界面结果如下所示:
并发消费很重要的一点就是要知道这对于消息消费顺序有要求的场景千万不能用!!!
五、参考链接
[01] RabbitMQ详细入门教程系列 -【手动消费确认】
544、RabbitMQ详细入门教程系列 -【手动消费确认】 2022.09.05相关推荐
- 543、RabbitMQ详细入门教程系列 -【Confirm与Mandatory】 2022.09.05
目录 一.前言概述 二.SpringAMQP配置Confirm 2.1 Connection设置 2.2 template设置 2.3 Confirm实现 三.SpringAMQP配置ManDator ...
- 546、Zookeeper详细入门教程系列 -【Zookeeper内部原理】 2022.11.06
目录 一.Zookeeper内部原理 1.1 节点类型(Znode) 1.2 Stat结构体 1.3 监听器原理 1.4 选举机制 1.5 写数据流程 二.最后 三.参考链接 一.Zookeeper内 ...
- 大数据入门教程系列之Hive内置函数及自定义函数
本篇文章主要介绍Hive内置函数以及自定义UDF函数和UDFT函数,自定义UDF函数通过一个国际转换中文的例子说明. 操作步骤: ①.准备数据和环境 ②.演示Hive内置函数 ③.自定义UDF函数编写 ...
- Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向
本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...
- Linux Shell脚本入门教程系列之(十二)Shell until循环
本文是Linux Shell脚本系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环 ...
- Linux Shell脚本入门教程系列之(十一)Shell while循环
本文是Linux Shell脚本系列教程的第(十一)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上一篇Linux Shell系列教程之(十)Shell for循环中, ...
- Linux Shell脚本入门教程系列之(九)Shell判断 if else 用法
本文是Linux Shell脚本系列教程的第(九)篇,更多shell教程请看:Linux Shell脚本系列教程 判断语句是每个语言都必不可少的关键语法,Shell命令当然也不例外.继上一篇之后,今天 ...
- Linux Shell脚本入门教程系列之(八)Shell printf命令详解
本文是Linux Shell脚本系列教程的第(八)篇,更多shell教程请看:Linux Shell脚本系列教程 在上一篇:Linux Shell系列教程之(七)Shell输出这篇文章中,已经对She ...
- Linux Shell脚本入门教程系列之(七)Shell输出
本文是Linux Shell脚本系列教程的第(七)篇,更多shell教程请看:Linux Shell脚本系列教程 与其他语言一样,Shell中也有输出操作,而且在实际应用中也是非常重要的,继上一篇之后 ...
最新文章
- 难以置信!小冰数字孪生虚拟人直播70天,没人发现不是真人
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)类类型转换
- java spring 拦截器_Spring MVC拦截器(Interceptor)的配置及使用
- hibernate关联映射_具有关联映射的Hibernate Composite ID
- c#输入三个数选出最大的_C#习题,3、 输入三个数字,输出他们的最大值。(if) | 学步园...
- Matplotlib - subplot(同一图中绘制不同的内容)
- 安装ECShop报 Non-static method cls_image::gd_version() should not be called statically 解决方案
- Server 2012 Log off 按键
- 网络摄像机 c++ 抓拍_IP摄像机和工业摄像机怎么区分 IP摄像机和工业摄像机差异...
- flask html 得到文本框 input的内容_Python的Web框架Flask + Vue 生成漂亮的词云
- 如何编写自己的python包,并进行安装和发布
- 武昌职业学院与湖北美和易思教育科技有限公司校企签约揭牌仪式隆重举行
- 搜狗输入法在别的屏幕
- 接口自动化第四篇----应用工厂模式下的HttpClient请求
- 问道手游服务器配置文件,问道手游脚本视频教程
- 新店速递丨白玉兰(商务)酒店赣榆吾悦广场店 正式上线
- 哔哩哔哩面试经验分享
- windows下查看python下安装的opencv版本
- 关于业财税一体化的思考
- 练习编程的过程中,运行时出现黑框一闪而过的解决方法