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 {@AutowiredRabbitTemplate rabbitTemplate;public void setRabbitTemplate() {//convertAndSend("RabbitMQ虚拟主机路径","消息队列","消息内容")rabbitTemplate.convertAndSend("", "text", "abc123456");}}

控制层

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

效果

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

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

2.收消息

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

//监听器 workQueue1队列名 如果队列中有消息 就取走//@RabbitListener(queues = "text") 接收消息,queues="队列名"@RabbitListener(queues = "text")//默认参数Messagepublic 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")//默认参数Messagepublic 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);}

取出满足条件的消息

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

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

相关文章

The C programming language (second edition,KR) exercise(CHAPTER 1)

E x c e r c i s e 1 − 2 Excercise\quad 1-2 Excercise1−2&#xff1a;测试结果如图1所示&#xff0c;这里需要注意的是转义字符序列 \ o o o \backslash ooo \ooo和序列 \ x h h \backslash xhh \xhh分别表示3个八进制数和2个十进制数对应的值对应于 A S C I I ASCII ASCII…

Django Cookie和Session

Django Cookie和Session 【一】介绍 【1】起因 HTTP协议四大特性 基于请求响应模式&#xff1a;客户端发送请求&#xff0c;服务端返回响应基于TCP/IP之上&#xff1a;作用于应用层之上的协议无状态&#xff1a;HTTP协议本身不保存客户端信息短链接&#xff1a;1.0默认使用短…

python asyncio websockets server

python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…

Chronos: 将时间序列作为一种语言进行学习

这是一篇非常有意思的论文&#xff0c;它将时间序列分块并作为语言模型中的一个token来进行学习&#xff0c;并且得到了很好的效果。 Chronos是一个对时间序列数据的概率模型进行预训练的框架&#xff0c;它将这些值标记为与基于transformer的模型(如T5)一起使用。模型将序列的…

小谈HTML5和CSS3的一些重要特性,页面重构需要注意的方面?

HTML5和CSS3是当前前端开发中最重要的技术之一。它们提供了丰富的功能和效果&#xff0c;使得页面设计更加灵活和交互性更强。在进行页面重构时&#xff0c;我们需要注意一些方面&#xff0c;以确保页面的质量和性能。下面将详细介绍HTML5和CSS3的一些重要特性&#xff0c;并讨…

vscode连接不上,终端ssh正常,一直输入密码正确但是无法登录

若是之前链结果突然等不上&#xff0c;使用第一个链接 若是第一次链接连不上&#xff0c;先使用第二个链接&#xff0c;在使用第一个链接 原因&#xff1a;原因是服务器端的wget命令不能使用&#xff0c;vscode需要服务器端下载个文件&#xff0c;无法下载就导致了如上的错误…

BaseDao封装增删改查(超详解!)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍对数据库中表中的数据进行增改删查询&#xff0c;封装一个工具类&#xff08;BaseDao&#xff09;的详细使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &…

ActiveMQ Artemis 系列| High Availability 主备模式(消息复制) 版本2.19.1

一、ActiveMQ Artemis 介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理&#xff0c;它完全符合 Java Message Service (JMS) 2.0 规范&#xff0c;并支持多种通信协议&#xff0c;包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foun…

正则表达式篇

文章目录 1. 导入re模块2. 正则表达式的基本模式3. re模块的主要函数和方法4. 示例 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex或regexp&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种…

C++ ——数组介绍和实例

文章目录 **定义数组****初始化数组****访问数组元素****一维数组与多维数组****数组与指针****数组的局限性****现代C中的替代方案** 以下是一个C程序实例&#xff0c;演示了如何定义、初始化、访问一维数组以及使用循环遍历数组&#xff1a; C ——数组 C 中的“数组”是一种…

vue2项目设置浏览器标题title及图标logo

工作中肯定会遇到要修改网页的标题title及图标logo 一、固定设置标题方案 方法一&#xff1a;在vue.config.js文件&#xff0c;添加如下代码&#xff1a; chainWebpack: config > {// 配置网页标题config.plugin(html).tap((args) > {args[0].title 标题return args})…

《装饰器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 模式说明&#xff1a; 方案&#xff1a; 装饰类和派生类同根&#xff0c;然后装饰类中放一个派生类&#xff0c;以在接口不动的情况下增加功能优点&#xff1a; 可以灵活地扩展对象功能&#xf…

[TS面试]keyof和typeof关键字作用?

keyof和typeof关键字作用? keyof 索引类型查询操作符, 获取索引类型属性名, 构成联合类型 typeof 获取一个变量或者对象的类型 let str:string ‘hello’ // typeof str >:string keyof typeof 获取 联合类型的key enum A{A, B, C }type unionType keyof typeof A; /…

static修饰成员的作用

1、static概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b;用static修饰的成员函数**&#xff0c;称之为静态成员函数。**静态成员变量一定要在类外进行初始化。 class A{ public: A() { _scount; } A…

数字身份的革命:解锁 Web3 的身份验证技术

引言 随着数字化时代的到来&#xff0c;个人身份认证成为了日常生活和商业活动中不可或缺的一部分。传统的身份验证方式存在着安全性低、易伪造、不便利等问题&#xff0c;因此&#xff0c;人们迫切需要一种更安全、更便捷的身份验证技术。在这样的背景下&#xff0c;Web3的身…

macos下 jupyter服务安装和vscode链接密码设置 .ipynb文件

最近收到了一些后缀为.ipynb的文件&#xff0c; 这个文件就是使用jupyter编辑的&#xff0c;于是就需要安装一个jupyter服务&#xff0c; 对于最新版本的jupyter 网上很多的资料都已经过期了&#xff0c;这里以最新版本的jupyter为例。 jupyter lab安装 jupyter 这个工具包含…

微软正在改进其AI驱动的Copilot在Microsoft Teams中的工作方式,为会议聊天、总结等引入了新的召唤助手方式

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如何更好的优化HTTPS

由裸数据传输的 HTTP 协议转成加密数据传输的 HTTPS 协议&#xff0c;给应用数据套了个「保护伞」&#xff0c;提高安全性的同时也带来了性能消耗。 HTTPS 相比 HTTP 协议多一个 TLS 协议握手过程&#xff0c;目的是为了通过非对称加密握手协商或者交换出对称加密密钥 分析性…

CUDA安装 Windows版

目录 一、说明 二、安装工具下载 三、CUDA安装 四、cuDNN配置 五、验证安装是否成功 一、说明 windows10 版本安装 CUDA &#xff0c;首先需要下载两个安装包 CUDA toolkitcuDNN 官方教程 CUDA&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-micro…

校园app开发流程-uniapp开发-支持APP小程序H5-源码交付-跑腿-二手市场-交友论坛等功能,学校自由选择!

随着科技的不断发展&#xff0c;智慧校园系统和跑腿外卖小程序已经成为当今社会的热门话题。作为未来的重要趋势之一&#xff0c;科技在教育领域中的应用越来越广泛。本文将探讨智慧校园系统和跑腿外卖小程序的开发过程&#xff0c;并阐述如何利用科技“育”见未来 一、智慧校…