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默认使用短…

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

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

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…

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})…

[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; /…

数字身份的革命:解锁 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领…

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;并阐述如何利用科技“育”见未来 一、智慧校…

接口自动化之 + Jenkins + Allure报告生成 + 企微消息通知推送

接口自动化之 Jenkins Allure报告生成 企微消息通知推送 在jenkins上部署好项目&#xff0c;构建成功后&#xff0c;希望可以把生成的报告&#xff0c;以及结果统计发送至企微。 效果图&#xff1a; 实现如下。 1、生成allure报告 a. 首先在Jenkins插件管理中&#x…

LVS负载均衡-DR模式配置

LVS&#xff1a;Linux virtual server ,即Linux虚拟服务器 LVS自身是一个负载均衡器&#xff08;Director&#xff09;&#xff0c;不直接处理请求&#xff0c;而是将请求转发至位于它后端的真实服务器real server上。 LVS是四层&#xff08;传输层 tcp/udp&#xff09;负载均衡…

11.Notepad++

文章目录 一、下载和安装设置练习 以前在记事本上写的代码看上去有点累&#xff0c;因为所有的单词看上去都是黑色的&#xff0c;并且当代码出现问题后&#xff0c;它提示第三行&#xff0c;我们还需要一行一行去数。这些问题都可以由一个高级记事本&#xff1a; Notepad 来解…

Windows直接运行python程序

Windows直接运行python程序 一、新建bat脚本二、新建vbs脚本 一、新建bat脚本 新建bat批处理脚本&#xff0c;写入以下内容 echo off call conda activate pytorch python app.pyecho off&#xff1a;在此语句后所有运行的命令都不显示命令行本身&#xff0c;但是本身的指令是…

第二篇:3.1 广告印象(AD Impression) - IAB与MRC及《增强现实广告效果测量指南1.0》

--- 我为什么要翻译美国IAB科技公司系列标准 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见度 …

前端埋点全解及埋点SDK实现方式

一、什么是埋点 所谓“埋点”&#xff0c;是数据采集领域&#xff08;尤其是用户行为数据采集领域&#xff09;的术语&#xff0c;指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。比如用户某个icon点击次数、观看某个视频的时长等等。 埋点…

什么是物联网监控平台?部署物联网平台有什么作用?

随着物联网技术的飞速发展&#xff0c;越来越多的企业开始关注并投入到这一领域。物联网监控平台作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐成为企业数字化转型的关键组件。今天&#xff0c;我们将深入探讨物联网监控平台的定义、部署物联网平台的作用&#xff0c;以…

linux环境gitlab迁移到新服务器

目录 备份项目备份gitlab配置阿里云磁盘格式化准备 最近服务器中了挖矿病毒&#xff0c;清理几次&#xff0c;都没有搞定&#xff0c;只能重新安装gitlab 备份项目 先把项目备份到本地 git pull git remote prune origin确保本地代码是最新的并且拥有所有的分支 git remote …