Spring Boot 中的 @RabbitListener 注解是什么,原理,如何使用

news2024/12/26 7:03:33

Spring Boot 中的 @RabbitListener 注解是什么,原理,如何使用

在 RabbitMQ 中,消息的接收需要通过监听队列来实现。在 Spring Boot 应用程序中,可以使用 @RabbitListener 注解来监听队列,并在接收到消息时执行指定的方法。本文将介绍 @RabbitListener 注解的原理、使用方法和常见应用场景。

在这里插入图片描述

@RabbitListener 注解的原理

@RabbitListener 注解是 Spring AMQP 框架中的一个关键组件,它可以将一个方法标记为 RabbitMQ 的消息监听器。当有消息到达指定的队列时,@RabbitListener 注解会自动将消息转发给标记了该注解的方法。

@RabbitListener 注解有多个属性,包括 queues、containerFactory、concurrency 和 errorHandler 等。其中,queues 属性用于指定监听的队列名称;containerFactory 属性用于指定使用的 RabbitMQ 连接工厂;concurrency 属性用于指定并发消费者的数量;errorHandler 属性用于指定错误处理器。

在 Spring Boot 应用程序中,可以通过添加 spring-boot-starter-amqp 依赖来使用 @RabbitListener 注解。下面是一个简单的 @RabbitListener 配置示例。

@Configuration
public class RabbitConfig {

    @Value("${spring.rabbitmq.host}")
    private String host;

    @Value("${spring.rabbitmq.port}")
    private int port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setHost(host);
        connectionFactory.setPort(port);
        connectionFactory.setUsername(username);
        connectionFactory.setPassword(password);
        return connectionFactory;
    }

    @Bean
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setConcurrentConsumers(3);
        factory.setMaxConcurrentConsumers(10);
        return factory;
    }
}

在上面的代码中,我们定义了一个 RabbitConfig 类,通过 @Value 注解读取配置文件中的 RabbitMQ 主机、端口、用户名和密码。然后通过 ConnectionFactory 创建 RabbitMQ 连接工厂,并将其注入到 Spring 容器中。在 RabbitListenerContainerFactory 中,我们定义了并发消费者的数量为 3,最大并发消费者的数量为 10。

下面是一个使用 @RabbitListener 注解监听队列并处理消息的示例代码。

@Service
public class MessageService {

    private static final String QUEUE_NAME = "queue";

    @RabbitListener(queues = QUEUE_NAME, containerFactory = "rabbitListenerContainerFactory")
    public void handleMessage(String message) {
        // 处理消息
        // ...
    }
}

在上面的代码中,我们定义了一个 MessageService 类,使用 @RabbitListener 注解监听指定的队列,并在接收到消息时执行 handleMessage 方法。在 @RabbitListener 注解中,我们指定了监听的队列名称和使用的 RabbitListenerContainerFactory。

常见应用场景

异步任务处理

在 Spring Boot 应用程序中,可以使用 @RabbitListener 注解来实现异步任务处理。当一个任务需要执行较长时间时,可以将任务放入 RabbitMQ 的队列中,由消费者来执行任务。这样,可以避免因为长时间任务的阻塞而导致应用程序的性能下降。

下面是一个异步任务处理的示例代码。

@Service
public class TaskService {

    private static final String QUEUE_NAME = "task_queue";

    @RabbitListener(queues = QUEUE_NAME, containerFactory = "rabbitListenerContainerFactory")
    public void handleTask(String task) {
        // 执行任务
        // ...
    }
}

在上面的代码中,我们定义了一个 TaskService 类,使用 @RabbitListener 注解监听任务队列。当有新任务到来时,执行 handleTask 方法来处理任务。

发布订阅模式

在 RabbitMQ 中,可以使用 Fanout 类型的 Exchange 来实现发布订阅模式。在 Spring Boot 应用程序中,可以使用 @RabbitListener 注解来实现订阅者的消息接收。当发布者向 Exchange 发布消息时,Exchange 会将消息发送给所有绑定到它上面的队列。订阅者通过监听队列来接收消息。

下面是一个发布订阅模式的示例代码。

@Service
public class SubscriberService {

    private static final String EXCHANGE_NAME = "exchange";

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue,
            exchange = @Exchange(name = EXCHANGE_NAME, type = ExchangeTypes.FANOUT)
    ), containerFactory = "rabbitListenerContainerFactory")
    public void handleSubscribeMessage(String message) {
        // 处理订阅消息
        // ...
    }
}

在上面的代码中,我们定义了一个 SubscriberService 类,使用 @RabbitListener 注解监听绑定到 Exchange 上的队列。当 Exchange 接收到新消息时,会将消息发送给所有绑定到它上面的队列。在 @RabbitListener 注解中,我们使用 bindings 属性指定了队列和 Exchange 的绑定关系,使用 containerFactory 属性指定了使用的 RabbitListenerContainerFactory。

总结

@RabbitListener 注解是 Spring AMQP 框架中的一个关键组件,它可以将一个方法标记为 RabbitMQ 的消息监听器。在 Spring Boot 应用程序中,可以使用 @RabbitListener 注解来监听队列,并在接收到消息时执行指定的方法。在本文中,我们介绍了 @RabbitListener 注解的原理、使用方法和常见应用场景。通过使用 @RabbitListener 注解,可以方便地实现异步任务处理、发布订阅模式等功能。

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

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

相关文章

Java实现OpenAI模型训练

本文章介绍如何用java实现OpenAI模型训练,仅供参考 提前准备工作 OpenAI KEY,获取方式可自行百度需要自备VPN 或 使用国外服务器转发需要训练的数据集,文章格式要求为JSONL,格式内容详见下图(尽量不要低于500个问答&…

消息模块的数据模型设计

目录 一、创建POJO映射类 1. message集合 2. message_ref集合 二、MongoDB的联合查询 MessageRef:保存消息接收人相关信息,接收人ID、消息已读未读、消息是否最新接收。 在 MongoDB 里面我们不需要预先去创建集合,只要我们往 MongoDB 里…

Linux常用命令——finger命令

在线Linux命令查询工具 finger 用于查找并显示用户信息 补充说明 finger命令用于查找并显示用户信息。包括本地与远端主机的用户皆可,帐号名称没有大小写的差别。单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名…

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

鲸鱼算法WOA优化VMD参数,最小包络熵、样本熵、信息熵、排列熵(适应度函数可自行选择,一键修改)包含MATLAB源代码...

鲸鱼优化算法(Whale optimization algorithm, WOA)是Mirjalili根据座头鲸的捕食行为而提出来的&#xff0c;算法对座头鲸的狩猎行为进行模仿&#xff0c;通过对猎物的寻找&#xff0c;然后攻击进行觅食&#xff0c;以此来达到优化的目的&#xff0c;已有很多学者将算法用于实际…

【C/C++实现进程间通信 二】消息队列

文章目录 前情回顾思路源码Publisher.cppSubscriber.cpp 效果 前情回顾 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示消息传递机制实现1进程间通信的相关代码。 思路 /*本项目主要用于以消息传递机制的方式进行进程间通信的测试。1.主要…

很荣幸与屈晗煜在 GitLink 编程夏令营(GLCC)活动中协作

作为一名软件工程师&#xff0c;天然有着追求代码质量的执念。相信很多人对代码的优雅、质量有着自己的认识&#xff0c;业界也有不少的共识&#xff0c;其中有一条我认为是非常重要的——代码可测试。 作为一名研发&#xff0c;只关注功能可测&#xff08;容易测&#xff09;是…

BUUCTF old-fashion 1

题目描述&#xff1a; 密文&#xff1a; Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmy…

多元回归预测 | Matlab基于鲸鱼算法(WOA)优化混合核极限学习机HKELM回归预测, WOA-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于鲸鱼算法(WOA)优化混合核极限学习机HKELM回归预测, WOA-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

【软考程序员学习笔记】——数据结构与算法基础

目录 &#x1f34a;一、数据结构概念和分类 &#x1f34a;二、数组特点&存储方式 &#x1f34a;三、矩阵 特殊矩阵 非特殊矩阵 &#x1f34a;四、栈和队列 &#x1f34a; 五、二叉树的性质 &#x1f34a;六、二叉树的遍历 (1)前序遍历(先根遍历&#xff0c;先序遍历…

《MySQL》什么是数据库

文章目录 数据库的理解MySQL的架构SQL语句分类存储引擎 数据库的理解 我们所下的数据库软件(如MySQL)其实是中间件。如何理解呢&#xff0c;如图&#xff1a; 我们用户通过MySQL对数据进行管理。 mysql #客户端程序 mysqld #服务端程序&#xff0c;再修改配置后需要重新启动…

【MySQL】在Linux终端上使用MySQL的简单介绍

本文仅供学习参考&#xff01; MySQL是一个开源的跨平台关系数据库管理系统&#xff08;RDBMS&#xff09;。MySQL使用标准查询语言&#xff08;SQL&#xff09;与MySQL软件进行通信。 数据库管理员和开发人员通过运行语句与 RDBMS 交互&#xff0c;这些语句在数据库管理中称为…

前端Vue自定义登录界面切换tabs 账号登录验证码登录模版 支持手机号校验邮箱校验验证码发送

前端Vue自定义登录界面切换tabs 账号登录验证码登录模版 支持手机号校验邮箱校验、验证码发送&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13298 效果图如下&#xff1a; # cc-loginTabs #### 使用方法 使用方法 …

Spring Boot中@RabbitHandler注解的介绍、原理和使用

Spring Boot中RabbitHandler注解的介绍、原理和使用 引言 在RabbitMQ中&#xff0c;消息的消费者需要根据不同的消息类型进行不同的处理。在Spring Boot中&#xff0c;我们可以通过RabbitHandler注解来实现这一功能。本文将介绍Spring Boot中RabbitHandler注解的介绍、原理和…

【聚类算法】DBSCAN基于密度聚类

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 瞬间感觉kmeans不香了&#xff0c;哈哈哈 说明&#xff1a; 该算法不仅能聚类&#xff0c;还能剔除离群点&#xff0c;聚类以后标签为-1的即噪声点&…

滑动折叠效果简单实现

绿色为标题&#xff0c;滑动时始终不会被折叠、不会滑动。红色和黑色会在滑动的时候折叠&#xff0c;先折叠红色&#xff0c;在折叠黑色。 activity_shop_search.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <layout xmlns:androi…

css实现元素纵向排列自动换列

块级元素在容器类纵向排列&#xff0c;当达到最大高度后自动换到下一列 <div id"main-div"><div class"item">1 一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容一条内容…

王道考研计算机网络第四·章知识点汇总

4.1.1网络层功能概述 4.1.2 SDN基本概念 4.2.1 路由算法和路由协议概述 4.3.1 IP数据报格式 4.3.2 IP数据报分片 4.3.3 IPv4地址 4.3.4 网络地址转换NAT 4.3.5 子网划分和子网掩码 不同子网掩码得到的网络地址可能相同 网络号为B类地址&#xff0c;16位网络号&#xff1b;6位子…

从四个角度全面认识 ChatGPT

传统语言模型是什么样的&#xff1f;ChatGPT 涌现出了哪些新能力&#xff1f;这些能力都是怎么做到的&#xff1f;在 ChatGPT 大模型时代&#xff0c;我们应该怎么做&#xff1f; 当下最引人注目的语言模型 ChatGPT 如火如荼&#xff0c;主要还是因为其能力远远超越了传统模型。…

js中堆的操作和案例!

堆 什么是堆&#xff1f; 堆是一种特殊的完全二叉树。完全二叉树的含义就是每层节点都完全填满&#xff0c;除了最后一层外只允许最右边缺少若干个节点。在 JavaScript 中通常用数组表示堆&#xff08;按照广度优先遍历顺序&#xff09;。 最大堆 最小堆 特性 所有的节…