RabbitMQ消费者限流实现消息处理优化

 更新时间:2023年05月20日 08:41:45   作者:小白的救赎  
这篇文章主要介绍了RabbitMQ消费者限流实现消息处理优化,消费者限流是用于消费者每次获取消息时限制条数,注意前提是手动确认模式,并且在手动确认后才能获取到消息,感兴趣想要详细了解可以参考下文

目录结构

导入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
        <version>2.5.0</version>
    </dependency>
</dependencies>

修改yml

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    listener:
      simple:
        acknowledge-mode: manual # 手动确认模式
        prefetch: 1 # 每次消费仅1条消息

业务逻辑

为了验证是否一定要手动确认才能真正消费消息,如下我进行了测试:首先我先让生产者生产两条消息在队列当中,如下图1所示。其次再看代码逻辑。当启动了消费者代码后入下图2所示:虽然确确实实被限流了,有一条未确认的消息,但当我们关闭消费者端的应用后,就又会变成图1所示。

图1

/**
 * 消费者的限流机制
 *  1、确保Ack机制为手动机制:acknowledge-mode: manual
 *  2、每次消费消息的个数:prefetch: 1 只有手动确认完后才会拉取下一条消息
 */
@Component
public class QosListener implements ChannelAwareMessageListener {
    @RabbitListener(queues = "test_queue_name")
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        System.out.println("消费者接受的消息为:" + new String(message.getBody()));
    }
}

图2

所以可以当我们再次改变业务逻辑:进行手动确认后就可以发现消息确确实实被消费了,如图3所示。要注意哈:第二个是否批量签收参数表示的是开启消费者后是否只会读取一次消息,而消费者限流prefetch表示的是每次读取只能为一条消息。两者的概念是不一样的。

/**
 * 消费者的限流机制
 *  1、确保Ack机制为手动机制:acknowledge-mode: manual
 *  2、每次消费消息的个数:prefetch: 1 只有手动确认完后才会拉取下一条消息
 */
@Component
public class QosListener implements ChannelAwareMessageListener {
    @RabbitListener(queues = "test_queue_name")
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        Thread.sleep(5000);
        long deliveryTag = message.getMessageProperties().getDeliveryTag();// 消息的唯一标识id
        System.out.println("消费者接受的消息为:" + new String(message.getBody()));
        channel.basicAck(deliveryTag,true);//每5s读一次消息(限流后每次为一条)
    }
}

到此这篇关于RabbitMQ消费者限流实现消息处理优化的文章就介绍到这了,更多相关RabbitMQ消费者限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基础之位运算知识总结

    Java基础之位运算知识总结

    最近接触到了java位运算,之前对位运算的了解仅仅停留在表现结果上,乘2除以2,对背后的原理并不了解,现在学习记录一下,需要的朋友可以参考下
    2021-05-05
  • 使用Feign扩展包实现微服务间文件上传

    使用Feign扩展包实现微服务间文件上传

    这篇文章主要为大家详细介绍了使用Feign扩展包实现微服务间文件上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • 关于post请求内容无法重复获取的解决方法

    关于post请求内容无法重复获取的解决方法

    这篇文章主要介绍了关于post请求内容无法重复获取的解决方法,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-03-03
  • IDEA Maven Mybatis generator 自动生成代码(实例讲解)

    IDEA Maven Mybatis generator 自动生成代码(实例讲解)

    下面小编就为大家分享一篇IDEA Maven Mybatis generator 自动生成代码的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • idea 2023.1字体设置及自动调整大小的图文教程

    idea 2023.1字体设置及自动调整大小的图文教程

    这篇文章主要介绍了idea 2023.1字体设置及自动调整大小的教程,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java 集合线程安全的几种解决方法

    Java 集合线程安全的几种解决方法

    在多线程环境下使用Java集合类时,一定要充分考虑线程安全问题,对于ArrayList和HashMap这类非线程安全的集合,开发者可以根据具体的业务场景选择合适的解决方案,感兴趣的可以了解一下
    2025-12-12
  • Java中Object和内部类举例详解

    Java中Object和内部类举例详解

    这篇文章主要介绍了Java中Object和内部类的相关资料,Object类是Java中所有类的父类,提供了toString、hashCode和equals等方法,内部类分为实例内部类、静态内部类、匿名内部类和局部内部类,需要的朋友可以参考下
    2025-05-05
  • idea中ctrl+shift+f(在文件中查找)失效问题及解决过程

    idea中ctrl+shift+f(在文件中查找)失效问题及解决过程

    这段描述主要讲解了解决Win1微软键盘在Idea中按键无效的问题,以及搜狗输入法简繁体切换快捷键的关闭方法,帮助用户优化输入体验
    2026-05-05
  • Spring的Aware接口实现及执行顺序详解

    Spring的Aware接口实现及执行顺序详解

    这篇文章主要为大家介绍了Spring的Aware接口实现及执行顺序详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 详解Java两种方式简单实现:爬取网页并且保存

    详解Java两种方式简单实现:爬取网页并且保存

    本篇文章主要介绍了Java两种方式简单实现:爬取网页并且保存 ,主要用UrlConnection、HttpClient爬取实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-12-12

最新评论