SpringBoot整合RabbitMQ中交换机的使用(完成消息的发送和接收案例)

news2024/10/3 0:22:19

系列文章目录

1.SpringBoot整合RabbitMQ并实现消息发送与接收
2. 解析JSON格式参数 & 修改对象的key
3. VUE整合Echarts实现简单的数据可视化
4. List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
5. 使用AOP切面实现日志记录功能


文章目录

  • 系列文章目录
  • 前言
  • 一、交换机定义以及作用
  • 二、为什么使用交换机
  • 三、创建交换机
    • 3.1 创建交换机和队列
    • 3.2 创建接收者
    • 3.3 编写访问接口发送消息
  • 四、效果图
    • 4.1 postman调用接口
    • 4.2 控制台打印
    • 4.3 RabbitMq平台查看
  • 总结


前言

注:在学习交换机前,先要学习SpringBoot整合RabbitMQ的步骤和队列间的消息发送和接收:
因为以前写过《SpringBoot整合RabbitMQ并实现消息发送与接收》的文章,所以这篇文章设计到上篇文章的内容不会再进行讲解。如果有什么代码看不懂,请先查看上一篇文章:SpringBoot整合RabbitMQ并实现消息发送与接收 这篇文章重点讲述交换机的使用,理解交换机的作用和为什么要使用交换机。使大家能够在业务场合上去熟练的使用交换机实现不同的业务。


一、交换机定义以及作用

在RabbitMQ中,交换机(Exchange)是消息传递的核心组件之一。它负责接收来自生产者的消息,并将其路由到一个或多个称为队列(Queue)的目标。可以把交换机看做是一个邮局,生产者将消息投递到邮局中,交换机会根据消息的路由键将消息分发到不同的邮箱中

交换机根据规则将收到的消息分发给绑定到它上面的队列。这些规则可以通过指定交换机类型和绑定键(Binding Key)来定义。RabbitMQ提供了几种不同类型的交换机:

  1. 直接交换机Direct Exchange):它将消息路由到与绑定键完全匹配的队列。
  2. 主题交换机Topic Exchange):它根据绑定键和通配符的匹配规则将消息路由到一个或多个队列。
  3. 扇形交换机Fanout Exchange):它将消息广播到所有绑定到它上面的队列,忽略绑定键。
  4. 头部交换机Headers Exchange):它根据消息的头部属性进行匹配,将消息路由到与头部属性匹配的队列。

交换机的选择取决于消息的路由需求和业务场景。通过合理配置交换机和队列的绑定关系,可以实现灵活的消息路由和分发机制。

二、为什么使用交换机

使用交换机的主要目的是实现消息的路由(Routing)和分发(Distribution),以及实现解耦和灵活性。以下是一些使用交换机的重要原因:

  1. 灵活的消息路由:通过使用交换机,可以根据消息的路由键将消息发送到指定的队列中。这样可以实现不同类型的消息分发到不同的消费者,从而实现对消息的灵活控制。
  2. 解耦生产者和消费者:交换机可以实现解耦,即生产者不需要知道消息将被发送到哪个具体的队列,只需要将消息发送到指定的交换机即可,交换机会负责将消息路由到相应的队列中。
  3. 消息过滤和按需消费:通过合理配置交换机和队列的绑定关系,可以实现消息的过滤和按需消费,确保消息只被相关的消费者接收。
  4. 消息广播和订阅:某些类型的交换机(如Fanout Exchange)可以将消息广播到所有与之绑定的队列中,实现消息的订阅和广播功能。
  5. 支持多种消息分发策略:不同类型的交换机支持不同的消息分发策略,如直接匹配、通配符匹配等,从而满足不同场景下的消息路由需求。

总之,使用交换机可以提高消息系统的灵活性、可靠性和可维护性,使得消息的生产、路由和消费能够更加高效和灵活。

三、创建交换机

在理解了交换机的作用后,我们通过代码去使用交换机实现消息的发送与接收。这里我的案例使用最常用的**直接交换机(Direct Exchange)**实现消息的发送和接收。

3.1 创建交换机和队列

下述代码中,创建交换机完成后,需要将队列绑定到交换机上,这里的.with("info")routingKey,因为将消息给到交换机后,一个交换机可以绑定多个队列,但将消息发送到哪个队列,就需要routingKey去判断发送到哪个队列。

/**
 * 配置:
 * 创建交换机、创建队列、将队列绑定到交换机上
 */
@Configuration
public class RabbitMQConfig {

    // 创建交换机
    @Bean
    public DirectExchange directExchange() {
        System.err.println("心态~ 创建交换机:xintai_exchange");
        return new DirectExchange("xintai_exchange");
    }

    // 创建队列
    @Bean
    public Queue myQueue() {
        System.err.println("心态~ 创建队列:my_queue1");
        return new Queue("my_queue1");
    }

    // 将队列绑定到交换机上
    @Bean
    public Binding binding(Queue myQueue, DirectExchange directExchange) {
        System.err.println("心态~ 将队列绑定到交换机上");
        return BindingBuilder.bind(myQueue).to(directExchange).with("info");
    }

}

3.2 创建接收者

@RabbitListener用来监听上述创建的队列my_queue1的消息。

/**
 * 接收消息
 */
@Component
public class Consumer {

    @RabbitListener(queues = "my_queue1")
    public void receiveMessage(String message) {
        System.out.println("心态~ my_queue1队列接收到消息:" + message);
    }
}

3.3 编写访问接口发送消息

下述代码中,rabbitTemplate.convertAndSend是rabbitmq用来发送消息的方法。其中第一个参数是交换机的名称(创建时的名称),第二个参数是routingKey,这里也是在上述代码中创建的,第三个参数就是需要发送的消息内容。

@RestController
@RequestMapping("/messages1")
public class MessageController1 {

//    @Autowired
//    private Producer producer;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/send1")
    public String sendMessage(@RequestParam String message) {
        System.err.println("心态~ 进入Controller层,接收到消息message ="+message);

        System.err.println("心态~ convertAndSend 转换并发送xintai_exchange交换机,routingKey为info");
        rabbitTemplate.convertAndSend("xintai_exchange", "info", message);
        return "消息发送成功!";
    }

}

四、效果图

4.1 postman调用接口

代码就编写完了,启动项目,启动rabbitmq。在postman中调用接口去发送消息。如下图所示:
在这里插入图片描述

4.2 控制台打印

发送完消息后,查看控制台打印效果,可得看到以成功接收到消息。如下图所示:
在这里插入图片描述

4.3 RabbitMq平台查看

登录http://localhost:15672,点击exchanges,可看到代码创建的交换机。如下图所示:
在这里插入图片描述
点击xintai_exchange交换机,会看到这个交换机里队列详情信息。如下图所示:
在这里插入图片描述


总结

这边就实现了交换机的使用,看到这里您也一定实现了这个发送消息的操作吧。但您一定会想到,如果一个交换机有多个队列,那怎么配置呢?怎么去实现只将消息发送到一个交换机里的一个队列呢?这就是routingKey配置和在RabbitMQConfig直接创建队列进行绑定就行。原理一样,大家多多思考练习~

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

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

相关文章

雷电模拟器打开指针位置无效果解决方法(开发者模式)

预期效果 1.打开文件所在位置 2.进入vms目录 3.新建一个名为debug的txt格式的文件 4.打开开发者模式里面指针位置的选项 5.重启模拟器 6.噔噔噔噔~

教你如何将Web项目部署到Linux中

文章目录 前言0. 什么是部署1. 调整代码达成一致2. 数据库建表3. 构建项目并打包4. 拷贝到 Tomcat 中5. 效果总结 前言 在我们完成了一个Web项目后, 我们该怎样将项目部署到 Linux 系统中呢? 本文就来简单讲解一下. 文章已部署本人的博客系统代码展开讲解. 关注收藏, 开始学…

【数据库】数据库中的备份与恢复,保障容灾时的数据一致性与完整性

数据库的备份机制 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期…

postman定义公共函数这样写,测试组长直呼牛逼!!!

postman定义公共函数 在postman中,如下面的代码: 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}:实际结果: ${actual} , 期望结果:${expected}]actualexpected…

YOLO目标检测——卫星遥感多类别检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用:卫星遥感目标检测数据集说明:卫星遥感多类别检测数据集,真实场景的高质量图片数据,数据场景丰富,含网球场、棒球场、篮球场、田径场、储罐、车辆、桥、飞机、船等类别标签说明:使用lableimg标…

Mysql中自增主键是如何工作的

自增主键的特点是当表中每新增一条记录时,主键值会根据自增步长自动叠加,通常会将自增步长设置1,也就是说自增主键值是连续的。那么MySQL自增主键值一定会连续吗?今天这篇文章就来说说这个问题,看看什么情况下自增主键…

灵活运用Vue 3中的setup函数—深入解析Composition API

新建项目,项目主入口为App.vue(主组件),新建child.vue(子组件)。 1.1 setup 执行 时机问题 1.在主组件里引入子组件和ref: import {ref} from vue import child from ./components/child.vue2…

数据科学导论——数据预处理

第1关:引言-根深之树不怯风折,泉深之水不会涸竭 第2关:数据清理-查漏补缺 import numpy as np import pandas as pd import matplotlib.pyplot as plt def student():train = pd.read_csv(Task1/diabetes_null.csv, na_values=[#NAME?])train[Insulin] = train[Insulin].f…

【20年扬大真题】试写一算法在带头结点的单链表结构上实现线性表操作LENGTH(L)

【20年扬大真题】 试写一算法在带头结点的单链表结构上实现线性表操作LENGTH&#xff08;L&#xff09;。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #include<malloc.h> //单链表定义 //链表结点 int A[10] { 1,2,3,4,5,6,…

Java生成一个区域内的经纬度随机点的方式

准备&#xff1a; 1、四个角点&#xff08;四个点确定一个框&#xff09; 2、想要细分程度 &#xff08;这里说的是经纬度&#xff0c;这里没有对经纬度做更细的区分&#xff09; 如&#xff1a;0.000001约等于0.1m&#xff0c;0.00001约等于1m&#xff0c;0.0001约等于10m 。。…

小黑子—Maven高级

Maven高级篇 二 小黑子的Maven高级篇学习1. 分模块开发1.1 分模块开发设计1.2 分模块开发实现1.2.1 抽取domain层1.2.2 抽取dao层 2. 依赖管理2.1 依赖传递2.2 可选依赖2.3 排除依赖 3. 继承与聚合3.1 聚合3.2 继承3.3 总结 4. 属性4.1 配置文件加载属性4.2 版本管理 5. 多环境…

浅谈JDK动态代理(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 到目前为止&#xff0c…

Java面向对象(高级)-- 类中属性赋值的位置及过程

文章目录 一、赋值顺序&#xff08;1&#xff09;赋值的位置及顺序&#xff08;2&#xff09;举例&#xff08;3&#xff09;字节码文件&#xff08;4&#xff09;进一步探索&#xff08;5&#xff09;最终赋值顺序&#xff08;6&#xff09;实际开发如何选 二、(超纲)关于字节…

梦开始的地方——Adobe Premiere Pro

今天&#xff0c;我们来说说一款老生常谈的相信也是很多人都经常迫切需要的软件。Adobe Premiere Pro&#xff0c;简称Pr&#xff0c;是由Adobe公司开发的一款视频编辑软件。 Premiere Pro是视频编辑爱好者和专业人士必不可少的视频编辑工具。它可以提升您的创作能力和创作自由…

Element中el-table组件右侧空白隐藏-滚动条

开发情况&#xff1a; 固定table高度时&#xff0c;出现滚动条&#xff0c;我们希望隐藏滚动条&#xff0c;或修改滚动条样式&#xff0c;出现table右边出现15px 的固定留白。 代码示例 <el-table class"controlTable" header-row-class-name"controlHead…

httpd(Web服务器)

名词解释 1、URL&#xff1a;Uniform Resource Locator&#xff0c;统⼀资源定位符 2、⽹址格式&#xff1a;<协议>://<主机或主机名>[:port]/<⽬录资源,路径> 3、主机地址/主机名&#xff1a;主机地址是服务器在因特⽹所在的IP地址。主机名就需要域名解析…

arduino入门一:点亮第一个led

void setup() { pinMode(12, OUTPUT);//12引脚设置为输出模式 } void loop() { digitalWrite(12, HIGH);//设置12引脚为高电平 delay(1000);//延迟1000毫秒&#xff08;1秒&#xff09; digitalWrite(12, LOW);//设置12引脚为低电平 delay(1000); }

【正则插件】前端正则插件以及预览插件推荐

1&#xff09; 2&#xff09; any-rule Pegex Previewer 下载好插件之后 在代码层右键选择 选择你需要的正则表达式&#xff0c;随后可以使用第二个插件 正则表达式插入之后顶部会有 Test Regex.. 点击会出现以下内容 将他 ctrl a 删除&#xff0c;输入你对应的正则表达…

HarmonyOS ArkTS HTTP数据请求(九)

1 概述 日常生活中我们使用应用程序看新闻、发送消息等&#xff0c;都需要连接到互联网&#xff0c;从服务端获取数据。例如&#xff0c;新闻应用可以从新闻服务器中获取最新的热点新闻&#xff0c;从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种能实时从服务…

Qt全球峰会2023中国站 参会概要

Qt全球峰会2023中国站 参会概要 前言峰会议程签到 & Demo 演示开场致辞Qt Group 产品总监演讲&#xff08;产品开发的趋势-开放的软件、工具和框架&#xff09;产品战略QtQuick or QtWidgets&#xff08;c or qml&#xff09;Qt如何定义AI个人看法 Qt 在券商数字化转型和信…