Spring Boot 中的 @RabbitListenerContainerFactory 注解

news2024/11/18 13:55:48

Spring Boot 中的 @RabbitListenerContainerFactory 注解

1. 什么是 @RabbitListenerContainerFactory

在 Spring Boot 中,我们可以使用 @RabbitListener 注解来监听 RabbitMQ 中的消息。@RabbitListener 注解会自动创建一个监听器容器,用于接收和处理消息。默认情况下,Spring Boot 使用 SimpleRabbitListenerContainerFactory 来创建监听器容器。如果我们需要自定义监听器容器,可以使用 @RabbitListenerContainerFactory 注解。

@RabbitListenerContainerFactory 注解是一个用于创建 RabbitMQ 监听器容器工厂的注解。它可以用于自定义监听器容器的配置,例如线程池大小、消息确认机制、消息转换器等。

在这里插入图片描述

2. @RabbitListenerContainerFactory 的原理

在 Spring Boot 中,@RabbitListenerContainerFactory 注解是通过 RabbitListenerAnnotationBeanPostProcessor 来实现的。RabbitListenerAnnotationBeanPostProcessor 是一个 Bean 后置处理器,它会扫描所有带有 @RabbitListener 注解的方法,并根据 @RabbitListener 注解的属性来创建监听器容器。如果一个方法使用了自定义的 @RabbitListenerContainerFactory 注解,那么 RabbitListenerAnnotationBeanPostProcessor 将会使用这个注解来创建监听器容器工厂。

在创建监听器容器工厂时,Spring Boot 会根据 @RabbitListenerContainerFactory 注解的属性来配置监听器容器。例如,如果我们需要开启消息确认机制,可以在 @RabbitListenerContainerFactory 注解中设置 acknowledgeMode 属性为 AcknowledgeMode.AUTO

3. 如何使用 @RabbitListenerContainerFactory

3.1. 使用默认的监听器容器工厂

当我们使用 @RabbitListener 注解时,Spring Boot 默认会使用 SimpleRabbitListenerContainerFactory 来创建监听器容器。如果我们不需要对监听器容器进行自定义配置,可以直接在方法上添加 @RabbitListener 注解,例如:

@RabbitListener(queues = "myQueue")
public void processMessage(String message) {
    // 处理消息
}

在这个示例中,我们使用 @RabbitListener 注解来监听名为 myQueue 的队列,并在 processMessage 方法中处理接收到的消息。

3.2. 自定义监听器容器工厂

如果我们需要自定义监听器容器,可以使用 @RabbitListenerContainerFactory 注解来创建自定义的监听器容器工厂。以下是一个自定义监听器容器工厂的示例代码:

@Configuration
public class MyRabbitListenerContainerFactory {

    @Bean(name = "myFactory")
    public SimpleRabbitListenerContainerFactory myFactory(ConnectionFactory connectionFactory) {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setConcurrentConsumers(3);
        factory.setMaxConcurrentConsumers(10);
        factory.setAcknowledgeMode(AcknowledgeMode.AUTO);
        return factory;
    }

    @Bean(name = "myListener")
    public MessageListenerAdapter myListener() {
        return new MessageListenerAdapter(new MyMessageListener());
    }

    @Bean
    public SimpleMessageListenerContainer myContainer(ConnectionFactory connectionFactory, @Qualifier("myListener") MessageListenerAdapter listenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames("myQueue");
        container.setMessageListener(listenerAdapter);
        container.setAcknowledgeMode(AcknowledgeMode.AUTO);
        container.setConcurrency("3-10");
        return container;
    }
}

在这个示例中,我们使用 @RabbitListenerContainerFactory 注解来创建一个名为 myFactory 的自定义监听器容器工厂。我们在 myFactory 中设置了一些监听器容器的属性,例如线程池大小、消息确认机制等。

接着,我们使用 @Bean 注解来创建一个名为 myListener 的消息监听器,并将其设置到 SimpleMessageListenerContainer 中。最后,我们使用 @Bean 注解来创建一个名为 myContainer 的自定义监听器容器,将其绑定到 myQueue 队列上,并使用 myListener 作为消息监听器。

在使用自定义监听器容器时,我们需要在 @RabbitListener 注解中指定使用的工厂名称,例如:

@RabbitListener(queues = "myQueue", containerFactory = "myFactory")
public void processMessage(String message) {
    // 处理消息
}

在这个示例中,我们在 @RabbitListener 注解中指定了使用 myFactory 工厂来创建监听器容器,从而使用自定义的监听器容器。

4. 总结

@RabbitListenerContainerFactory 注解是一个用于创建 RabbitMQ 监听器容器工厂的注解。它可以用于自定义监听器容器的配置,例如线程池大小、消息确认机制、消息转换器等。在使用自定义监听器容器时,我们需要在 @RabbitListener 注解中指定使用的工厂名称。使用 @RabbitListenerContainerFactory 注解能够帮助我们更好地管理 RabbitMQ 监听器容器,从而提高应用程序的性能和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode-每日一题【876.链表的中间结点】

题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3…

云贝餐饮连锁独立版 v2.6.1+公众号+小程序端+抖音端端+全插件免授权安装使用教程

云贝餐饮连锁版这系统应该持续做好多年了比较完善,以前的版本都需要授权一直没使用,整体测试下感觉从体验上还有逻辑设计上都非常不错,首页、会员中心支持DIY装修,配送支持多种平台对接,基本上餐饮行业需要的功能都能满…

Plant, Cell Environment:DAP-seq技术在ZmEREB57调控OPDA合成提高玉米耐盐性研究中的应用

茉莉酸类化合物(JAs)是植物中普遍存在的一类植物激素,在非生物胁迫响应中发挥重要作用。12-氧-植物二烯酸(OPDA)可通过α-亚麻酸(ALA)代谢途径合成JA,是一种重要的JA前体分子。APETA…

DNSPod十问朱智:为什么商场越来越像美食中心?

本期嘉宾 朱智 赢商tech副总裁 朱智,赢商tech副总裁兼首席产品官。线下大数据服务的领军人物,福布斯中国“30under30”人物,拥有10余年线下商业大数据服务经验,致力于商业地产数智化升级领域,服务了包括新城集团、新…

【Linux系统编程】Linux权限理解 及 权限管理

文章目录 前言1. Linux权限的概念2. Linux权限管理2.1 文件类型2.2 Linux用户分类及切换用户分类普通用户—>rootroot—>普通用户普通用户之间的切换单条指令的提权 2.3 用户角色划分/文件访问者的分类(人)2.4 文件类型和访问权限(事物…

windows环境部署nacos注意事项

1.nacos与 eureka部署方式有所不同,nacos需要到GitHub去下载,下载地址:https://github.com/alibaba/nacos,下载好后将文件放至项目中 2.需要将nacos用到的数据文件导入到数据库中 3.需要修改nacos的配置文件 注意:修改…

wampServer安装Redis 扩展

第一步:查看php版本信息 使用 phpinfo() 函数查看 PHP 的版本信息(用于选择扩展包) 版本信息:PHP版本为 8.0.26,编译器版本 Visual C 2019,CPU架构 x64 。 第二步:根据第一步信息的版本选择扩…

jpg图片马使用条件竞争的方法实现二次渲染绕过

文章目录 一、制作图片马二、上传图片马三、上传攻击四、访问攻击五、启动攻击 一、制作图片马 首先使用cmd制作jpg图片马 二、上传图片马 然后打开bp拦截上传该图片马 三、上传攻击 对拦截的结果发送到攻击模块 清除所有变量,payloads做如下设置 四、访问…

VBA之正则表达式(42)-- 快速提取名称

实例需求:A列为待处理数据,现需要从中提取商品名、通用名、胰岛素笔相关信息,保存到B列至D列,需要注意如下几点: 胰岛素笔(E列)数据只存在于每组产品的第一行记录中,例如第2行数据中…

redis配置和优化

关系数据库与非关系型数据库 关系型数据库: 关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。 SQL 语句(标准数据查询语言)就是一种基于关系型数据库的…

[MySQL]1292 - Incorrect date value: ‘0000-00-00‘ for column ‘xxx‘ at row 1

第一步、修改mysql配置文件 sql_mode去掉NO_ZERO_DATE 注意:如果mysql配置文件内容没有sql_mode,需要手动加上 mysql配置文件示例: 第二步、重启MySQL

基于Python热门旅游景点数据分析系统设计与实现

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专…

SpringBoot 实现 elasticsearch 查询操作(RestHighLevelClient 的案例实战)

文章目录 1. 环境准备1. 查询全部2. 根据 name 查询 match 分词查询3. 根据 name 和 品牌查询 multiMatch 分词查询4. 根据 brand 查询 match 分词查询5. 按照价格 范围查询6. 精确查询7. boolQuery8. 分页9. 高亮查询9. 公共解析 上一节讲述了 SpringBoot 实现 elasticsearch …

Attention Is All You Need (NIPS 2017)

Attention Is All You Need - 注意力就是你所需要的(NIPS 2017) 摘要1. 引言2. 背景3. 模型架构3.1 编码器和解码器堆叠3.2 注意力3.2.1 缩放点积注意力3.2.2 多头注意力3.2.3 注意力在我们的模型中的应用 3.3 位置前馈网络3.4 嵌入和Softmax3.5 位置编码…

【⑧MySQL进阶】:子查询与HAVING/SELECT的完美结合

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL子查询在HAVING/SELECT字句中使用、及相关子查询和WITH/EXISTS字句的讲解✨ 目录 前言一、在HAVING/SELECT字句中使用子查询二、相关子查询三、WITH/EXISTS、NOT EXISTS字句四、总结 一、在HAVING/SELECT字句中…

手机提醒打卡软件哪个好用 每日计划的打卡软件推荐

在人生的不同阶段,人们会有不同的目标,为了目标可以很好地实现,可以将其分散为多个不同的小计划,并坚持不断地打卡完成每项计划,助力自己最终完成目标。那手机提醒打卡软件哪个好用些,每日计划的打卡软件推…

针对中国用户?数万个正规网站被劫持

知名安全公司Acronis被黑客攻破,多达12GB的资料泄露。 而黑客给出的攻击理由令人啼笑皆非——在他们看来,这家公司虽然从事网络安全业务,但实际上技术如shit一样。 黑客觉得很无聊,就想羞辱一下对方,遂动手攻击了这家网…

软件设计模式与体系结构-设计模式-工厂模式

目录 0. 学习目标0.1 软件设计模式0.2 软件体系结构 软件设计模式0. 软件设计原则设计模式的分类 创建型软件设计模式一、工厂模式工厂方法与抽象工厂模式1.简单工厂方法模式(开闭原则)优缺点适用场景实例一:简单电视机工厂 2.工厂方法模式优…

人机融合是自由与决定的交互

人机融合是指人类与机器之间的紧密合作与互动。在这种融合中,人类使用机器的能力来增强自身的能力,而机器则依赖人类的指导和判断来发挥作用。这种融合可以带来许多好处和机会,但也伴随着一些挑战和风险。 首先,人机融合可以为人类…

Quiz 16_3-3: Databases | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 16_3-3: Databases单选题(1-10)操作题Autograder: Many Students in Many Courses Python for Everybody 课程简介 Python for Everybody 零基础程序设计(Python 入门) This course a…