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.hqwc.cn/news/571747.html

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

相关文章

Java八股文(SpringCloud Alibaba)

Java八股文のSpringCloud Alibaba SpringCloud Alibaba SpringCloud Alibaba Spring Cloud Alibaba与Spring Cloud有什么区别&#xff1f; Spring Cloud Alibaba是Spring Cloud的衍生版本&#xff0c;它是由Alibaba开发和维护的&#xff0c;相比于Spring Cloud&#xff0c;它在…

JavaScript Uncaught ReferenceError: WScript is not defined

项目场景&#xff1a; 最近在Visual Studio 2019上编译libmodbus库&#xff0c;出现了很多问题&#xff0c;一一解决特此记录下来。 问题描述 首先就是configure.js文件的问题&#xff0c;它会生成两个很重要的头文件modbus_version.h和config.h&#xff0c;这两个头文件其中…

如何使用Docker轻松构建和管理应用程序(二)

上一篇文章介绍了 Docker 基本概念&#xff0c;其中镜像、容器和 Dockerfile 。我们使用 Dockerfile 定义镜像&#xff0c;依赖镜像来运行容器&#xff0c;因此 Dockerfile 是镜像和容器的关键&#xff0c;Dockerfile 可以非常容易的定义镜像内容&#xff0c;同时在我们后期的微…

day53 动态规划part10

121. 买卖股票的最佳时机 简单 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可…

【Redis】Redis 介绍Redis 为什么这么快?Redis数据结构Redis 和Memcache区别 ?为何Redis单线程效率也高?

目录 Redis 介绍 Redis 为什么这么快&#xff1f; Redis数据结构 Redis 和Memcache区别 &#xff1f; 为何Redis单线程效率也高&#xff1f; Redis 介绍 Redis 是一个开源&#xff08;BSD 许可&#xff09;、基于内存、支持多种数据结构的存储系统&#xff0c;可以作为数据…

如何本地部署Elasticsearch+cpolar实现公网查询与管理内网数据

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff…

音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码

1. 音频采样 与视频不同&#xff0c;音频的最小单位不是一帧&#xff0c;而是一个采样。 采样是当前一刻声音的声音样本&#xff0c;样本需要经过数字转换才能存储为样本数据。 真实声音是连续的&#xff0c;但是在计算机中&#xff0c;声音是离散且均匀的声音样本。 2. 位深…

电阻的妙用:限流、分压、滤波,助力电路设计!

电阻可以降低电压&#xff0c;这是通过电阻的分压来实现的。事实上&#xff0c;利用电阻来降低电压只是电阻的多种功能之一。电路中的电阻与其他元件&#xff08;电容、电感&#xff09;结合用于限流、滤波等。&#xff08;本文素材来源&#xff1a;https://www.icdhs.com/news…

正则表达式 vs. 字符串处理:解析优势与劣势

title: 正则表达式 vs. 字符串处理&#xff1a;解析优势与劣势 date: 2024/3/27 15:58:40 updated: 2024/3/27 15:58:40 tags: 正则起源正则原理模式匹配优劣分析文本处理性能比较编程应用 1. 正则表达式起源与演变 正则表达式&#xff08;Regular Expression&#xff09;最早…

Windows的Linux子系统迁移

默认 Windows 的 Linux 子系统&#xff08;WSL&#xff09;安装的 C 盘&#xff0c;如果有用作 Docker 镜像制作很容易磁盘不够用。可采取如下步骤迁移&#xff08;以下在 Windows PowerShell 中进行的&#xff0c;但在 CMD.exe 中执行效果相同&#xff09;&#xff1a; 1、执…

大数据Hadoop入门04 ——【HDFS shell操作】

一、HDSF shell命令行解释说明 1、介绍 命令行界面&#xff08;英语: command-line interface&#xff0c;缩写: CLl)&#xff0c;是指用户通过键盘输入指令&#xff0c;计算机接收到指令后&#xff0c;予以执行一种人际交互方式。Hadoop提供了文件系统的shell命令行客户端:…

Redission 分布式锁原理分析

一、前言 我们先来说说分布式锁&#xff0c;为啥要有分布式锁呢? 像 JDK 提供的 synchronized、Lock 等实现锁不香吗&#xff1f;这是因为在单进程情况下&#xff0c;多个线程访问同一资源&#xff0c;可以使用 synchronized 和 Lock 实现&#xff1b;在多进程情况下&#xff…