当前位置:

首页 > 编程开发 > SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理

SpringBoot怎么整合RabbitMq自定义消息监听容器来实现消息批量处理

SpringBoot整合RabbitMq自定义消息监听容器来实现消息批量处理前言RabbitMQ是一种常用的消息队列,SpringBoot对其进行了深度的整合,可以快速地实现消息的发送和接收。在RabbitMQ中,消息的发送和接收都是异步的,因此需要使用监听器来监听消息的到来。SpringBoot中提供了默认的监听器容器,但是有时候我们需要自定义监听器容器,来满足一些特殊的需求,比如批量获取数据。在本文中,我们将使用SpringBoot来整合RabbitMQ,并自定义一个监听器容器,实现批量获取数据的功能

本文目录

    SpringBoot 整合RabbitMq 自定义消息监听容器来实现消息批量处理

    前言

    RabbitMQ是一种常用的消息队列,Spring Boot对其进行了深度的整合,可以快速地实现消息的发送和接收。在RabbitMQ中,消息的发送和接收都是异步的,因此需要使用监听器来监听消息的到来。Spring Boot中提供了默认的监听器容器,但是有时候我们需要自定义监听器容器,来满足一些特殊的需求,比如批量获取数据。

    在本文中,我们将使用Spring Boot来整合RabbitMQ,并自定义一个监听器容器,实现批量获取数据的功能。
    前置条件:
    在开始之前,您需要具备以下条件:

    • 已经安装好RabbitMQ服务器并启动。

    • 已经创建好要使用的队列。

    • 已经熟悉了Spring Boot和RabbitMQ的基本知识。

    环境准备:
    在开始之前,我们需要准备好以下环境:

    • JDK 1.8或以上版本

    • Spring Boot 2.5.0或以上版本

    • RabbitMQ 3.8.0或以上版本

    添加依赖

    首先,在pom.xml文件中添加以下依赖:

    
        org.springframework.boot
        spring-boot-starter-amqp
    

    配置文件

    接下来,在application.properties文件中添加以下配置:

    spring.rabbitmq.host=localhost
    spring.rabbitmq.port=5672
    spring.rabbitmq.username=guest
    spring.rabbitmq.password=guest
    spring.rabbitmq.virtual-host=/
    
    # 队列名称
    spring.rabbitmq.listener.simple.queue-name=myQueue
    
    # 最大并发消费者数量
    spring.rabbitmq.listener.simple.concurrency=5
    
    # 最小数量
    spring.rabbitmq.listener.simple.min-concurrency=1
    
    # 最大数量
    spring.rabbitmq.listener.simple.max-concurrency=10
    
    # 批量处理消息的大小
    spring.rabbitmq.listener.simple.batch-size=50

    或

    spring:
      rabbitmq:
        host: localhost
        listener:
          simple:
            batch-size: 50
            concurrency: 5
            max-concurrency: 10
            min-concurrency: 1
            queue-name: myQueue
        password: guest
        port: 5672
        username: guest
        virtual-host: /

    编写监听器

    然后,我们需要创建一个监听器类,以便处理从队列中接收到的消息。以下是一个简单的示例:

    @Component
    public class MyListener {
        
        @RabbitListener(queues = "myQueue", containerFactory = "myFactory")
        public void handleMessage(List messages, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag)
                throws IOException {
            try {
                // 处理消息
                System.out.println("Received " + messages.size() + " messages");
                for (Message message : messages) {
               		// 处理消息
                	System.out.println("Received message: " + new String(message.getBody()));
            	}
            	channel.basicAck(messages.get(messages.size() - 1).getMessageProperties().getDeliveryTag(), true);
            } finally {
                // 手动确认消息
                channel.basicAck(deliveryTag, true);
            }
        }
    }

    在上面的代码中,我们使用了@RabbitListener注解来指定要监听的队列名称,同时也指定了使用myFactory工厂来创建监听容器。在这个监听器中,我们简单地打印了接收到的消息。

    创建SimpleRabbitListenerContainerFactory

    接下来,我们需要创建一个SimpleRabbitListenerContainerFactory工厂,以便能够自定义监听容器的行为。以下是一个简单的示例:

    @Configuration
    public class RabbitMQConfig {
    
    //    @Bean
    //    public SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {
    //        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    //        factory.setConnectionFactory(connectionFactory);
    //        factory.setConcurrentConsumers(1);
    //        factory.setMaxConcurrentConsumers(10);
    //        factory.setBatchListener(true);
    //        factory.setBatchSize(50);
    //        return factory;
    //    }
    
    	@Bean
        public SimpleRabbitListenerContainerFactory myFactory(
                ConnectionFactory connectionFactory,
                PlatformTransactionManager transactionManager,
                MessageConverter messageConverter) {
            
            SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
            
            // 并发消费者数,默认为 1
            factory.setConcurrentConsumers(5);
            
            // 最大并发消费者数,默认为 1
            factory.setMaxConcurrentConsumers(10);
            
            // 拒绝未确认的消息并重新将它们放回队列,默认为 true
            factory.setDefaultRequeueRejected(false);
            
            // 容器启动时是否自动启动,默认为 true
            factory.setAutoStartup(true);
            
            // 消息确认模式,默认为 AUTO
            factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
            
            // 每个消费者在一次请求中预获取的消息数,默认为 1
            factory.setPrefetchCount(5);
            
            // 从队列中接收消息的超时时间,默认为 0,表示没有超时限制
            factory.setReceiveTimeout(1000);
            
            // 与容器一起使用的事务管理器。默认情况下,容器不会使用事务
            factory.setTransactionManager(transactionManager);
            
            // 消息转换器,用于将接收到的消息转换为 Java 对象或将 Java 对象转换为消息
            factory.setMessageConverter(messageConverter);
            
            // 用于异步消息处理的线程池。默认情况下,容器使用一个简单的 SimpleAsyncTaskExecutor
            factory.setTaskExecutor(new SimpleAsyncTaskExecutor());
            
            // 在关闭容器时等待活动线程终止的时间,默认为 5000 毫秒
            factory.setShutdownTimeout(10000);
            
            // 重试失败的消息之前等待的时间,默认为 5000 毫秒
            factory.setRecoveryInterval(5000);
            
            // 如果消息处理器尝试监听不存在的队列,是否抛出异常。默认为 true
            factory.setMissingQueuesFatal(false);
            
            // 监听器容器连接工厂
            factory.setConnectionFactory(connectionFactory);
    
            return factory;
        }
    }

    这些属性中的大多数都是可选的,可以根据需要进行设置。根据应用程序的需求,我们可以自由地调整这些属性,以提高应用程序的性能和可靠性。

    发送消息

    最后,我们可以编写一个简单的发送消息的代码来向队列中发送一些消息。以下是一个简单的示例:

    @Component
    public class MySender {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        public void sendMessage(String message) {
            for (int i = 0; i < 100; i++) {
                rabbitTemplate.convertAndSend("myQueue", "message:" + i);
            }
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    RabbitMQ Fanout Exchange 多消费者正确实现指南
    RabbitMQ Fanout Exchange 多消费者正确实现指南

    在Go中使用RabbitMQFanoutExchange时,多个消费者需同时接收消息。正确做法是声明fanout类型交换器,并为每个消费者创建独立队列并绑定到该交换器,确保交换器类型正确、队列名唯一,RabbitMQ会将消息广播至所有绑定队列,实现一对多分发。

    Centos 6.4 安装erlang&rabbitmq的方法
    Centos 6.4 安装erlang&rabbitmq的方法

    在开始搭建消息队列服务之前,得先搞定两个核心组件:Erlang 和 RabbitMQ。Erlang 是 RabbitMQ 的运行时环境,所以顺序不能乱——先装 Erlang,再装 RabbitMQ。下面把整个过程拆开来讲,每一步都配了具体的命令,照着走基本不会出错。 1. 安装 Erlang 1.1

    Symfony 将RabbitMQ消息转为数组方法
    Symfony 将RabbitMQ消息转为数组方法

    答案:将Symfony中RabbitMQ消息转为数组需根据消息体格式选择反序列化方式,常见为JSON或PHP序列化;若为JSON,使用json_decode($messageBody,true)转换并校验错误;若为PHP序列化,使用unserialize()但需注意安全风险;其他格式则用对应解析器;若消息封装在对象中,需先提取消息体。

    Python RabbitMQ教程:消息队列入门指南
    Python RabbitMQ教程:消息队列入门指南

    Python操作RabbitMQ的关键在于理解其消息队列流程和工作机制,安装pika库后即可通过简单步骤实现消息发送与接收。首先需安装pika:pipinstallpika,并确保RabbitMQ服务运行;其次,发送消息时需建立连接、打开通道、声明队列并发送消息;接着,接收消息时需监听队列、定义回调函数处理消息,并注意确认机制与连接关闭;此外,实际应用中应关注异常处理、消息持久化、多消费者支持及死信队列等特性以提升系统健壮性。掌握这些步骤和注意事项后,Python结合RabbitMQ的基础操作便能快速上手

    PHP实战:RabbitMQ消息队列详解
    PHP实战:RabbitMQ消息队列详解

    PHP结合RabbitMQ构建异步处理系统需安装RabbitMQ和AMQP扩展1,通过AMQP类连接服务器2,声明交换机和队列并绑定路由键3,使用publish方法发布消息4,利用consume消费消息并调用ack确认5,为避免消息丢失应启用持久化、发布者确认或事务机制6,可通过RabbitMQManagementPlugin、命令行工具或Prometheus+Grafana监控性能7,配置死信队列处理无法消费的消息8,保证消息顺序可通过单消费者、单一队列或分组排序等策略实现9。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具
    学习如何安装、配置、部署和使用宝塔面板中的RabbitMQ可视化工具

    RabbitMQ是一款开源的消息代理和队列服务器,旨在通过通用协议实现不同应用之间的数据共享,实现跨平台和跨语言的通信。该系统采用Erlang语言编写,并基于AMQP协议。其最显著的特点之一是在提供高度解耦的服务之间无需确保提供方的存在。接下来介绍关于如何在宝塔面板上可视化安装、配置、部署、使用RabbitMQ。一、RabbitMQ的特点1.可靠性RabbitMQ通过诸如持久化、传输确认和发布确认等机制来确保消息的可靠性。2.灵活的路由消息在进入队列之前通过交换器进行路由,可按照特定规则进行灵活分发。3.

    PHP开发中如何使用RabbitMQ实现消息传递
    PHP开发中如何使用RabbitMQ实现消息传递

    RabbitMQ是一种消息队列软件,可用于在应用程序之间进行消息传递。在PHP开发中,使用RabbitMQ可以实现异步处理任务、实现分布式系统等。本篇文章将介绍如何在PHP开发中使用RabbitMQ实现消息传递。一、安装RabbitMQ服务RabbitMQ是开源软件,可从其官网(https://www.rabbitmq.com/download.html)下

    PHP与RabbitMQ结合实现消息队列处理和分发的方法
    PHP与RabbitMQ结合实现消息队列处理和分发的方法

    随着互联网业务的不断发展,系统间的数据交换变得越来越频繁。在传统的请求响应式架构中,数据传递的方式往往是同步的,即等待请求响应结果后才能进行下一步操作,当数据量较大或者请求响应时间较长时,这种方式往往会导致系统性能下降。此时,消息队列就成为一种比较理想的解决方案,可以实现异步、解耦、扩展性好等优点。RabbitMQ作为一款消息队列中间件,提供了丰富的API,

    比较RabbitMQ和Kafka:如何选择高效的消息中间件
    比较RabbitMQ和Kafka:如何选择高效的消息中间件

    RabbitMQ和Kafka的比较:选择高效的消息中间件简介消息中间件是一种软件,它允许应用程序通过异步消息传递进行通信。消息中间件可以用于各种目的,包括:解耦应用程序:消息中间件可以将应用程序解耦,使它们能够独立于彼此开发和部署。提高可伸缩性:消息中间件可以帮助应用程序提高可伸缩性,使它们能够处理更多的并发请求。提高可靠性:消息中间件可以帮助应用程序提高可

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。