SpringBoot3的RabbitMQ消息服务

目录

预备工作和配置

1.发送消息

实现类

控制层

效果

2.收消息

3.异步读取

效果

4.Work queues --工作队列模式

创建队列text2

实体类

效果

5.Subscribe--发布订阅模式

效果

6.Routing--路由模式

效果

7.Topics--通配符模式

效果


异步处理、应用解耦、流量削锋、分布式事务管理等,使用消息服务可以实现一个高性能、高可用、高扩展的系统。

为了高效处理消息,使用第三种方式,在写入消息队列后就响应,存在队列中。

预备工作和配置

打开RabbitMQ和控制页面并登录

新建一个消息队列

创建项目加入依赖并且写好配置类

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# 配置RabbitMQ消息中间件连接配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

1.发送消息

实现类

调用RabbitTemplate类的convertAndSend方法,设置消息内容和消息队列。

@Service
public class DemoService {
    @Autowired
    RabbitTemplate rabbitTemplate;

    public void setRabbitTemplate() {
        //convertAndSend("RabbitMQ虚拟主机路径","消息队列","消息内容")
        rabbitTemplate.convertAndSend("", "text", "abc123456");
    }
 }

控制层

@RestController
public class MyCoutrollor {
    @Autowired
    DemoService demoService;

    @RequestMapping("/text")
    public String setDemoService() {
        demoService.setRabbitTemplate();
        return "setRabbitTemplate";
    }

效果

有一条消息,未取出,存在队列中

可见其中的值就是所存的值

2.收消息

监听器进行监听,不需要进行调用等,一旦发现该队列,将直接收取。

//监听器 workQueue1队列名 如果队列中有消息 就取走
    //@RabbitListener(queues = "text") 接收消息,queues="队列名"
    @RabbitListener(queues = "text")
    //默认参数Message
    public void revcMessage(Message message) {
        byte[] body = message.getBody();
        String result = new String(body);
        System.out.println(result);
    }

此时消息已被取走,队列中无消息。

3.异步读取

效果

此时并未取到值,只是存入队列后就立刻返回发送成功

4.Work queues --工作队列模式

指定唯一的消息队列进行消息传递。在这种模式下,多个消息消费者通过轮询的方式依次接收消息队列中存储的消息,一旦消息被某一个消费者接收,消息队列会将消息移除。

 @RabbitListener(queues = "text"),指定队列监听。

创建队列text2

实体类

@Data
public class User {
    public String name;
    public String password;
}

效果

//消息内容为对象
    public void setRabbitTemplate2() {
        User user = new User();
        user.setName("123");
        user.setPassword("123456");
        rabbitTemplate.convertAndSend("", "text", user);
    }

存进指定text2队列中

指定从text2中取出

//所有消息接受时,不管传输的是什么,接受时都转成字节
    @RabbitListener(queues = "text")
    //默认参数Message
    public void revcMessage2(User user) {
        System.out.println(user);
    }

此时队列中无消息

5.Subscribe--发布订阅模式

配置一个fanout类型的交换器,不需要指定对应的路由键(Routing key),同时会将消息路由到每一个消息队列上,然后每个消息队列都可以对相同的消息进行接收存储,在同一交换器下的所有队列都将收到消息。

@RabbitListener注解--创建队列和交换机并绑定,并且设置交换机类型。

效果

存入交换机中,此时不需要指定对应的键

  //广播模式
    public void setRabbitTemplate3() {
        User user = new User();
        user.setName("张三");
        user.setPassword("zhangsan123456");
        rabbitTemplate.convertAndSend("TextExchange", "", user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text3"),//队列名
            exchange = @Exchange(
                    value = "TextExchange",//交换机名
                    type = "fanout")))//交换机类型  fanout----广播模式
    public void revcMessage3(User user) {
        System.out.println("fanout  TextExchange text3"+user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text4"),//队列名
            exchange = @Exchange(
                    value = "TextExchange",//交换机名
                    type = "fanout")))//交换机类型  fanout----广播模式
    public void revcMessage4(User user) {
        System.out.println("fanout  TextExchange text4"+user);
    }

自动创建队列text3和text4

并且绑定了交换机

因为交换机类型为fanout----广播模式,所以该交换机绑定的所有队列均可收到消息。

6.Routing--路由模式

配置一个direct类型的交换器,并指定不同的路由键值(Routing key)将对应的消息从交换器路由到不同的消息队列进行存储,适用于进行不同类型消息分类处理的场合。

效果

指定了能取出消息的队列,所以应只有key = "info"的text5能取出消息。

//路由模式
    public void setRabbitTemplate4() {
        User user = new User();
        user.setName("123");
        user.setPassword("123456");
        rabbitTemplate.convertAndSend("Text4Exchange", "info", user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text5"),//队列名
            exchange = @Exchange(
                    value = "Text4Exchange",//交换机名
                    type = "direct"),key = "info"))//交换机类型  direct----路由模式
    public void revcMessage5(User user) {
        System.out.println("fanout  Text4Exchange text5  "+user);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text6"),//队列名
            exchange = @Exchange(
                    value = "Text4Exchange",//交换机名
                    type = "direct"),key = "error"))//交换机类型  direct----路由模式
    public void revcMessage6(User user) {
        System.out.println("fanout  Text4Exchange text6  "+user);
    }

7.Topics--通配符模式

配置一个topic类型的交换器。与Routing模式不同的是:Routing只能指定一个key值,而通配符可以指定一类key值,只要含有指定词的那一类队列都可以收到,加强版路由模式。

效果

指定了一类key值的消息能被取出,所以应只有首位是info并且其中含有email的消息能被取出

//通配符模式
    public void setRabbitTemplate5() {
        User user = new User();
        user.setName("小红");
        user.setPassword("xiaohong123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.email", user);
        User user1 = new User();
        user1.setName("小绿");
        user1.setPassword("xiaolv123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.sms", user1);
        User user2 = new User();
        user2.setName("小蓝");
        user2.setPassword("xiaolan123456");
        rabbitTemplate.convertAndSend("Text5Exchange", "info.email.sms", user2);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue("text7"),//队列名
            exchange = @Exchange(
                    value = "Text5Exchange",//交换机名
                    type = "topic"),key = "info.#.email.#"))//交换机类型  topic----通配符模式
    public void revcMessage7(User user) {
        System.out.println("topic  Text5Exchange text7  "+user);
    }

取出满足条件的消息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javascript基础练习题之渔夫捕鱼

一、题目要求&#xff1a;根据用户输入的年、月、日判断是打鱼还是晒网。代码中使用了isLeapYear函数来判断输入的年份是否为闰年&#xff0c;getDays函数来计算输入日期是一年中的第几天&#xff0c;然后根据计算结果来确定是打鱼还是晒网。最后代码通过弹窗提示用户是打鱼还是…

Kimi和ChatGPT做古诗词阅读理解,谁更胜一筹?

前几天发过一篇Kimi整理会议的体验教程&#xff0c;没想到大家很感兴趣&#xff0c;这次再来拿Kimi做古诗词阅读理解看看&#xff0c;同时也对比下ChatGPT的效果。 ChatGPT是几乎家喻户晓的AI大模型&#xff0c;Kimi和它对比有哪些异同点呢&#xff1f; 首先它们都是基于对话…

黑群晖Docker安装aria2-pro

前言 最近买了星际蜗牛C款当Nas&#xff0c;来满足我的存储需求&#xff0c;在之前我写过一篇docker安装aria2-pro的文章&#xff0c;既然买了nas那当然也要安装一个aria2-pro做下载器 1.安装 Container Manager 套件 可以在套件中心搜索docker找到 2.下载aria2-pro镜像 打…

欧拉函数、快速幂、扩展欧几里得算法、中国剩余定理

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 欧拉函数 欧拉函数&#xff08;Eulers totient function&#xff09;是一个与正整数n相关的数论函数&#xff0c;通常用φ(n)表示。定义为小于或等于n的正整数中与n互质的数的个数 int phi(int x) {int res x;for…

C语言例4-15:从键盘输入一个整数,求其绝对值并输出。

代码如下&#xff1a; //从键盘输入一个整数&#xff0c;求其绝对值并输出。 #include<stdio.h> int main(void) {int n;printf("输出一个整数&#xff1a; \n");scanf("%d",&n); //从键盘输入一个整数保存至变量nif(n<0) //…

找图识字模拟键鼠编程插件奥迦插件24.3.18

名称&#xff1a;奥迦插件24.3.18更新记录24.3.183 1.增加函数SetObjectNamesEncode2.修复按键函数在有些窗口不能按下方向键的问题命令功能介绍:奥迦插件在Windows 10操作系统上使用Visual Studio 2019编写,适用于所有较新的Windows平台,是一款集网络验证,深度学习,内核,视觉,…

出席2024亚太内容分发大会,火山引擎边缘云“加速”游戏体验升级

3月26日&#xff0c;第十四届亚太内容分发大会暨CDN峰会在北京成功举办&#xff0c;火山引擎边缘云产品架构高级总监许思安出席并以《火山引擎边缘云游戏行业解决方案&#xff0c;“加速”游戏体验升级》为主题&#xff0c;分享了火山引擎边缘云在游戏行业的思考和实践。同时&a…

01使用调试工具

文章目录 前言一、用openocd打开单片机二、利用4444端口向单片机写入hex文件三、利用3333端口和gdb进行调试四、之前我出的问题总结 前言 之前写了一篇关于在linux下搭建stm32标准库的文章后&#xff0c;有一些小伙伴们还是出现了一些奇奇怪怪的错误&#xff0c;这一篇文章就是…

多渠道整合策略全攻略:HubSpot出海CRM助力企业轻松获客

在全球化日益加速的今天&#xff0c;企业纷纷寻求出海机会&#xff0c;以拓展市场、增加客户基础。在这个过程中&#xff0c;一个强大的客户关系管理系统&#xff08;CRM&#xff09;显得尤为关键。作为业内领先的CRM解决方案提供商&#xff0c;HubSpot出海CRM以其强大的核心功…

5.1 物联网RK3399项目开发实录-Android开发之ADB使用(wulianjishu666)

物联网项目开发实例&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/11VQMhHfIL9mZhNlls4wmjw?pwd0gfa 1. ADB 使用 1.1. 前言 ADB&#xff0c;全称 Android Debug Bridge&#xff0c;是 Android 的命令行调试工具&#xff0c;可以完成多种功能&#xff0c;如跟踪系…

flutter Got socket error trying to find package nested at

flutter Got socket error trying to find package nested at xxx 报错信息&#xff1a;“Got socket error trying to find package nested at” 通常出现在Flutter尝试从pub.dev获取依赖包时&#xff0c;由于网络问题导致无法连接到pub.dev或者无法正确解析包的路径。 例如&…

LIS、LCS算法模型

文章目录 1.LCS算法模型2.LIS算法模型 1.LCS算法模型 LCS问题就是给定两个序列A和B&#xff0c;求他们最长的公共子序列。 在求解时&#xff0c;我们会设dp[i][j]表示为A[1 ~ i]序列和B[1 ~ j]序列中&#xff08;不规定结尾&#xff09;的最长子序列的长度。 if(a[i]b[i]) dp…

【算法刷题 | 二叉树 04】3.27(翻转二叉树、对称二叉树、完全二叉树的节点个数、平衡二叉树、完全二叉树的所有路径)

文章目录 6.翻转二叉树6.1问题6.2解法一&#xff1a;递归6.2.1递归思路&#xff08;1&#xff09;确定递归函数的参数和返回值&#xff08;2&#xff09;确定终止条件&#xff08;3&#xff09;确定单层递归的逻辑 6.2.2全部代码 6.3解法二&#xff1a;层序遍历 7.对称二叉树7.…

SQLynx发布3.0.0版本:带来更流畅便捷的SQL开发体验

作为新一代的一站式数据库管理开发工具&#xff0c; SQLynx自发布上线以来&#xff0c;一直受到广大用户的好评与鼓励。 为了给用户提供更高效、更便捷、更可靠的数据库管理开发体验&#xff0c;SQLynx今日正式发布3.0.0版本&#xff0c;同步在麦聪软件官网上线&#xff0c;全…

k8s入门到实战(十四)—— Helm详细介绍及使用

Helm 使用 Helm 是一个 k8s 应用的包管理工具&#xff0c;类似于 Ubuntu 的 APT 和 CentOS 中的 YUM。 Helm 使用 chart 来封装 k8s 应用的 yaml 文件&#xff0c;我们只需要设置自己的参数&#xff0c;就可以实现自动化的快速部署应用。 Helm 通过打包的方式&#xff0c;支…

常用的AD规则设置

目录 规则编辑器&#xff1a; 间距规则&#xff1a; 线宽规则&#xff1a; 过孔规则&#xff1a; 铺铜设置&#xff1a; 生成制造过孔&#xff1a; 过孔之间间距&#xff1a; 最小阻焊层间距&#xff1a; 丝印到阻焊的距离&#xff1a; 丝印到丝印距离&#xff1a; 走…

mysql 高阶语句 与视图

目录 一 前言 二 msql 高阶语句使用方法 &#xff08;一&#xff09; 查询并排序&#xff08;order by&#xff09; 1&#xff0c;排序方式 2&#xff0c;查询指定列 并排序 3, 条件判断&#xff08;过滤指定行&#xff09; 再查询指定列 并排序 4&#xff0c;查…

Android Viewpager 内外间距

Android使用Viewpager_内外边距 代码&#xff1a; 1、adapter&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_par…

Ubuntu20.04 安装 OpenCV3 过程中遇到的各种问题及其解决办法

文章目录 前言开始安装OpenCV3问题1&#xff1a;ICV: Failed to download ICV package: ippicv_linux_20151201.tgz.1.1 具体步骤 问题2&#xff1a;/usr/include/c/7/cstdlib:75:15: fatal error: stdlib.h: No such file or directory问题3&#xff1a;error: CODEC_FLAG_GLO…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…