专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

RabbitMQ(九) -- 手动消费确认

一:前言概述

RabbitMQ(四) –消费者Consumer一文中详细讲解了MQ消息消费的相关问题,在SpringAMQP中基本都会选择针对Connetion配置队列的监听器进行消息消费。配置默认的监听实例类SimpleMessageListenerContainer中对于消息消费的确认默认为autoAck,接下来本文将围绕手动ACK讲述

二:配置实现

2.1 XML配置

首先需要做的就是在消费监听中配置属性acknowledgemanual表示手动确认,然后就是在属性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 {

    @Override
    public void onMessage (Message message, Channel channel) throws Exception {
        // 消息
        byte[] body = message.getBody();
        // 确认ID
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        // 信道确认
        channel.basicAck(deliveryTag,false);
    }

}

三:消息预取

消费端每次访问RabbitMQ取出一条消息?这明显是不机智的设计,前面的文章也提到过这样的网络访问消耗是巨大的。所以有消息预取的概念,在SpringAMQP中如果没有限制那么将会是250数量消息的预取,假设这时消息体较大取到程序内存中,那就是自我炸裂。所以针对消息情况进行该参数控制很有必要

90_1.png

在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

90_2.png

四:并发消费

消息的积压大家都遇到过,消费者消息消费的速度跟不上生产者速度就会导致消息积压,对于很多消息及时性场景来讲都是不能接受的。所以SpringAMQP中提供并发消费的配置,如下所示:没有配置消费者数量时默认都是只有一个消费者

90_3.png修改消费者数量进行如下配置: concurrency属性

    <rabbit:listener-container connection-factory="cacheConnectionFactory" message-converter="jackson2JsonMessageConvert"
                               acknowledge="manual" prefetch="10" concurrency="5">
        <rabbit:listener id="jjDeadBaseQueueListener" queues="jjDeadBaseQueue" ref="jjConsumerListener"/>
    </rabbit:listener-container>

再上控制WEB界面结果如下所示:

90_4.png

并发消费很重要的一点就是要知道这对于消息消费顺序有要求的场景千万不能用!!!

文章永久链接:https://tech.souyunku.com/38202

未经允许不得转载:搜云库技术团队 » RabbitMQ(九) -- 手动消费确认

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们