RabbitMQ(四种使用模式)

文章目录

    • 1.Fanout(广播模式)
        • 1.基本介绍
        • 2.需求分析
        • 3.具体实现
          • 1.编写配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/exchange
            • 2.查看控制台输出,两个队列同时接受到了消息
          • 2.访问RabbitMQ控制台 http://ip:15672
            • 1.查看交换机是否绑定了两个队列
            • 2.再查看Queues,新增了两个队列
    • 2.Direct(路由模式)
        • 1.基本介绍
        • 2.需求分析
        • 3.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/direct/green
            • 2.访问 http://localhost:9092/seckill/mq/direct/red
          • 2.访问RabbitMQ控制台 http://140.143.164.206:15672
            • 1.交换机绑定了两个队列
            • 2.再查看Queues,新增了两个队列
    • 3.Topic(主题模式)
        • 1.基本介绍
          • 1.介绍
          • 2.关于匹配模式的说明
        • 2.需求分析
        • 3.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 4.启动测试
          • 1.示意图
          • 2.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1
            • 2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2
            • 3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2
            • 4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2
    • 4.Headers(头路由模式,使用较少)
        • 1.基本介绍
        • 2.示意图
        • 3.需求分析
        • 4.具体实现
          • 1.配置类 RabbitMQConfig.java
          • 2.编写生产者,发送消息到交换机并指定路由 MQSender.java
          • 3.编写消费者,接受消息 MQReceiver.java
          • 4.控制层调用方法,发送信息到交换机
        • 5.启动测试
          • 1.访问查看IDEA控制台输出
            • 1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一
            • 2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二
    • 5.RabbitMQ使用模式总结
        • 1.整体架构图
        • 2.通用使用方式
          • 1.编写RabbitMQ的配置类
          • 2.编写消息发送者
          • 3.编写消息接受者
          • 4.编写控制层

1.Fanout(广播模式)

1.基本介绍

image-20240511143401624

2.需求分析

image-20240511143533335

3.具体实现
1.编写配置类 RabbitMQConfig.java
    // 定义一个交换机,两个队列的名称private static final String EXCHANGE = "exchange";private static final String QUEUE1 = "queue1";private static final String QUEUE2 = "queue2";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue queue1() {return new Queue(QUEUE1, true);}// 创建队列2@Beanpublic Queue queue2() {return new Queue(QUEUE2, true);}// 创建交换机@Beanpublic FanoutExchange exchange() {return new FanoutExchange(EXCHANGE);}// 将队列一和交换机绑定@Beanpublic Binding binding1() {return BindingBuilder.bind(queue1()).to(exchange());}// 将队列二和交换机绑定@Beanpublic Binding binding2() {return BindingBuilder.bind(queue2()).to(exchange());}
2.编写生产者,发送消息到交换机 MQSender.java
    // 发送消息到交换机public void sendExchange(Object message) {log.info("发送消息到交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("exchange", "", message);}
3.编写消费者,接受消息 MQReceiver.java
    // 两个队列从交换机接受消息@RabbitListener(queues = "queue1")public void receive1(Object message) {log.info("queue1接收消息: " + message);}// 两个队列从交换机接受消息@RabbitListener(queues = "queue2")public void receive2(Object message) {log.info("queue2接收消息: " + message);}
4.控制层调用方法,发送信息到交换机
    // 发送信息到交换机@RequestMapping("/mq/exchange")@ResponseBodypublic void mqExchange() {mqSender.sendExchange("hello rabbitmq exchange");}
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/exchange

image-20240511145506791

2.查看控制台输出,两个队列同时接受到了消息

image-20240511145523594

2.访问RabbitMQ控制台 http://ip:15672
1.查看交换机是否绑定了两个队列

image-20240511145927045

image-20240511145938023

2.再查看Queues,新增了两个队列

image-20240511145956152

2.Direct(路由模式)

1.基本介绍

image-20240511150759660

2.需求分析

image-20240511151501711

3.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Direct模式 -----------------// 定义一个交换机,两个队列的名称private static final String DIRECT_EXCHANGE = "directExchange";private static final String DIRECT_QUEUE1 = "directQueue1";private static final String DIRECT_QUEUE2 = "directQueue2";// 定义两个路由分别为red和greenpublic static final String RED = "red";public static final String GREEN = "green";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue directQueue1() {return new Queue(DIRECT_QUEUE1, true);}// 创建队列2@Beanpublic Queue directQueue2() {return new Queue(DIRECT_QUEUE2, true);}// 创建Direct交换机@Beanpublic DirectExchange directExchange() {return new DirectExchange(DIRECT_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为red@Beanpublic Binding directBinding1() {return BindingBuilder.bind(directQueue1()).to(directExchange()).with(RED);}// 将队列二和交换机绑定,并指定路由为green@Beanpublic Binding directBinding2() {return BindingBuilder.bind(directQueue2()).to(directExchange()).with(GREEN);}// ----------------- Direct模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键public void sendDirect(Object message, String routingKey) {log.info("发送消息到Direct交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKeyrabbitTemplate.convertAndSend("directExchange", routingKey, message);}// ----------------- Direct模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Direct模式 -----------------// directQueue1接收消息@RabbitListener(queues = "directQueue1")public void receiveDirect(Object message) {log.info("directQueue1接收消息: " + message);}// directQueue2接收消息@RabbitListener(queues = "directQueue2")public void receiveDirect2(Object message) {log.info("directQueue2接收消息: " + message);}// ----------------- Direct模式 -----------------
4.控制层调用方法,发送信息到交换机
    // ----------------- Direct模式 -----------------// 发送消息到Direct交换机,指定路由键@RequestMapping("/mq/direct/{routingKey}")@ResponseBodypublic void mqDirect(@PathVariable String routingKey) {mqSender.sendDirect("hello rabbitmq direct", routingKey);}// ----------------- Direct模式 -----------------
4.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/direct/green

image-20240511155350571

2.访问 http://localhost:9092/seckill/mq/direct/red

image-20240511155417490

2.访问RabbitMQ控制台 http://140.143.164.206:15672
1.交换机绑定了两个队列

image-20240511155827225

image-20240511155911603

2.再查看Queues,新增了两个队列

image-20240511155943495

3.Topic(主题模式)

1.基本介绍
1.介绍

image-20240511161221729

2.关于匹配模式的说明
  • 星号:可以匹配一个单词
  • 井号:可以匹配零个或多个单词
2.需求分析

image-20240511161528268

3.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Topic模式 -----------------// 定义一个交换机,两个队列的名称private static final String TOPIC_EXCHANGE = "topicExchange";private static final String TOPIC_QUEUE1 = "topicQueue1";private static final String TOPIC_QUEUE2 = "topicQueue2";// 定义三个路由public static final String ROUTING_KEY1 = "*.orange.*";public static final String ROUTING_KEY2 = "*.*.rabbit";public static final String ROUTING_KEY3 = "lazy.#";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue topicQueue1() {return new Queue(TOPIC_QUEUE1, true);}// 创建队列2@Beanpublic Queue topicQueue2() {return new Queue(TOPIC_QUEUE2, true);}// 创建Topic交换机@Beanpublic TopicExchange topicExchange() {return new TopicExchange(TOPIC_EXCHANGE);}// 将队列一和交换机绑定,并指定路由为*.orange.*@Beanpublic Binding topicBinding1() {return BindingBuilder.bind(topicQueue1()).to(topicExchange()).with(ROUTING_KEY1);}// 将队列二和交换机绑定,并指定路由为*.*.rabbit和lazy.#@Beanpublic Binding topicBinding2() {return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY2);}@Beanpublic Binding topicBinding3() {return BindingBuilder.bind(topicQueue2()).to(topicExchange()).with(ROUTING_KEY3);}// ----------------- Topic模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键public void sendTopic(Object message, String routingKey) {log.info("发送消息到Topic交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的路由键为 routingKeyrabbitTemplate.convertAndSend("topicExchange", routingKey, message);}// ----------------- Topic模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Topic模式 -----------------// topicQueue1接收消息@RabbitListener(queues = "topicQueue1")public void receiveTopic1(Object message) {log.info("topicQueue1接收消息: " + message);}// topicQueue2接收消息@RabbitListener(queues = "topicQueue2")public void receiveTopic2(Object message) {log.info("topicQueue2接收消息: " + message);}// ----------------- Topic模式 -----------------
4.控制层调用方法,发送信息到交换机
    // ----------------- Topic模式 -----------------// 发送消息到Topic交换机,指定路由键@RequestMapping("/mq/topic/{routingKey}")@ResponseBodypublic void mqTopic(@PathVariable String routingKey) {mqSender.sendTopic("hello rabbitmq topic", routingKey);}// ----------------- Topic模式 -----------------
4.启动测试
1.示意图

image-20240511161528268

2.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/topic/one.orange.one 匹配Q1

image-20240511163348473

2.访问 http://localhost:9092/seckill/mq/topic/one.one.rabbit 匹配Q2

image-20240511163438210

3.访问 http://localhost:9092/seckill/mq/topic/lazy.orange.one 匹配Q1和Q2

image-20240511163527113

4.访问 http://localhost:9092/seckill/mq/topic/lazy.any.any.any.any 匹配Q2

image-20240511163618877

4.Headers(头路由模式,使用较少)

1.基本介绍

image-20240511164450490

2.示意图

image-20240511165737435

3.需求分析

image-20240511170148293

4.具体实现
1.配置类 RabbitMQConfig.java
    // ----------------- Headers模式 -----------------// 定义一个交换机,两个队列的名称private static final String HEADERS_EXCHANGE = "headersExchange";private static final String HEADERS_QUEUE1 = "headersQueue1";private static final String HEADERS_QUEUE2 = "headersQueue2";// 创建两个队列和一个交换机// 创建队列1@Beanpublic Queue headersQueue1() {return new Queue(HEADERS_QUEUE1, true);}// 创建队列2@Beanpublic Queue headersQueue2() {return new Queue(HEADERS_QUEUE2, true);}// 创建Headers交换机@Beanpublic HeadersExchange headersExchange() {return new HeadersExchange(HEADERS_EXCHANGE);}// 将队列一和交换机绑定,并指定key-value,使用any表示只要有一个匹配就可以@Beanpublic Binding headersBinding1() {Map<String, Object> map = new HashMap<>();map.put("key1", "value1");map.put("key2", "value2");return BindingBuilder.bind(headersQueue1()).to(headersExchange()).whereAny(map).match();}// 将队列二和交换机绑定,并指定key-value,使用all表示所有的key-value都要匹配@Beanpublic Binding headersBinding2() {Map<String, Object> map = new HashMap<>();map.put("key3", "value3");map.put("key4", "value4");return BindingBuilder.bind(headersQueue2()).to(headersExchange()).whereAll(map).match();}// ----------------- Headers模式 -----------------
2.编写生产者,发送消息到交换机并指定路由 MQSender.java
    // ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一public void sendHeaders(Object message) {log.info("发送消息到Headers交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {message1.getMessageProperties().getHeaders().put("key1", "value1");return message1;});}// 发送消息到Headers交换机,匹配队列二public void sendHeaders2(Object message) {log.info("发送消息到Headers交换机: " + message);// 发送消息到交换机,需要指定在配置类中配置的交换机名,这里的空字符串表示忽略路由键rabbitTemplate.convertAndSend("headersExchange", "", message, message1 -> {message1.getMessageProperties().getHeaders().put("key3", "value3");message1.getMessageProperties().getHeaders().put("key4", "value4");return message1;});}// ----------------- Headers模式 -----------------
3.编写消费者,接受消息 MQReceiver.java
    // ----------------- Headers模式 -----------------// headersQueue1接收消息@RabbitListener(queues = "headersQueue1")public void receiveHeaders1(Object message) {log.info("headersQueue1接收消息: " + message);}// headersQueue2接收消息@RabbitListener(queues = "headersQueue2")public void receiveHeaders2(Object message) {log.info("headersQueue2接收消息: " + message);}// ----------------- Headers模式 -----------------
4.控制层调用方法,发送信息到交换机
    // ----------------- Headers模式 -----------------// 发送消息到Headers交换机,匹配队列一@RequestMapping("/mq/headers")@ResponseBodypublic void mqHeaders() {mqSender.sendHeaders("hello rabbitmq headers");}// 发送消息到Headers交换机,匹配队列二@RequestMapping("/mq/headers2")@ResponseBodypublic void mqHeaders2() {mqSender.sendHeaders2("hello rabbitmq headers2");}// ----------------- Headers模式 -----------------
5.启动测试
1.访问查看IDEA控制台输出
1.访问 http://localhost:9092/seckill/mq/headers 匹配队列一

image-20240511173539342

2.访问 http://localhost:9092/seckill/mq/headers2 匹配队列二

image-20240511173600832

5.RabbitMQ使用模式总结

1.整体架构图

image-20240511173928100

2.通用使用方式
1.编写RabbitMQ的配置类
  • 创建交换机和队列
  • 将队列分别与交换机按照具体标识绑定
2.编写消息发送者
  • 指定交换机
  • 携带消息和具体队列标识
3.编写消息接受者
  • 只需要监听队列,接收消息即可
4.编写控制层
  • 调用消息发送者,向交换机发送请求

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

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

相关文章

工程师工具箱系列(3)Arthas

文章目录 工程师工具箱系列&#xff08;3&#xff09;Arthas安装与准备Arthas插件使用场景查看某个变量值ognl方式调用Bean方法tt(TimeTunel)方式调用Bean的方法ognl调用带参数方法 资源总览 工程师工具箱系列&#xff08;3&#xff09;Arthas Java诊断利器 安装与准备 window…

LabVIEW学习记录3 - 自定义函数

LabVIEW学习记录3 - 自定义函数 一、LabVIEW学习记录二、自定义函数及函数调用 一、LabVIEW学习记录 【labVIEW】学习记录LabVIEW学习记录2 - MySQL数据库连接与操作LabVIEW学习记录 - 实时显示时间LabVIEW学习记录4-局部变量、全局变量、共享变量 二、自定义函数及函数调用 …

C++入门-stack和queue(下)

大家好啊&#xff0c;在这先祝天下的母亲节日快乐啦&#xff01;现在呢&#xff0c;给大家带来C中priority_queue和容器适配器的相关知识点 3.1 C 中的优先队列&#xff08;priority_queue&#xff09;介绍 优先队列&#xff08;priority_queue&#xff09;是一种特殊的队列…

transformer与beter

transformer与beter 解码和编码器含义tokizer标记器和one-hot独热编码编码解码--语义较好的维度空间矩阵相乘--空间变换编码理解如何构造降维的嵌入矩阵--实现到达潜空间上面是基础&#xff0c;下面是transformer正文自注意力机制注意力分数--上下文修正系数为什么需要KQ两个矩…

ssm125四六级报名与成绩查询系统+jsp

四六级报名与成绩查询系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对四六级报名信息管理混乱&am…

达梦数据插入操作的深坑

提示错误&#xff1a;Only if specified in the column list and SET IDENTITY_INSERT is ON, then identity column could be assigned value 插入的语句采用缺省的方式实现&#xff0c;执行插入操作失败&#xff1b; 原因分析&#xff1a; 1.自增长的SQL表里面插入指定ID的…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页&#xff1a;https://diffusionfeatures.github.io/ 代码&#xff1a;https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章&#xff0c;任务是做图片的特征匹配&#xff08;关联&#xff09;&#xff0c;特…

【kali工具使用】Tcpdump 抓包查看三次握手过程

Tcpdump 抓包查看三次握手过程 tcpdump 常用参数&#xff1a; -c 指定要抓取的数据包数量 -n 对 IP 地址以数字方式显式&#xff0c;否则显式为主机名 port 指定端口 -I 指定 tcpdump 需要监听的接口。默认会抓取第一个网络接口 tcp 1ClientSYN1seqx 2Server SYN1 seq…

树莓派|超声波传感器

VCC&#xff1a;超声波模块电源脚&#xff0c;接5V电源即可 Trig&#xff1a;超声波发送脚&#xff0c;高电平时发送出40KHZ出超声波 Echo&#xff1a;超声波接收检测脚&#xff0c;当接收到返回的超声波时&#xff0c;输出高电平 GND&#xff1a;超声波模块GND 测距原理&…

2025考研 | 北京师范大学计算机考研考情分析

北京师范大学&#xff08;Beijing Normal University&#xff09;简称“北师大”&#xff0c;由中华人民共和国教育部直属&#xff0c;中央直管副部级建制&#xff0c;位列“211工程”、“985工程”&#xff0c;入选国家“双一流”、“珠峰计划”、“2011计划”、“111计划”、…

NCL绘制WRF domain区域并添加气象站点

读取文件 根据官网例子Using gsn_csm_contour_map to plot WRF-ARW data绘制&#xff1a; ; It shows how to use gsn_csm_xxxx scripts to do the plotting. ; ; You can use the map projection settings on the WRF file, or you ; can use your own map projection. See …

路由器、交换机和网卡

大家使用VMware安装镜像之后&#xff0c;是不是都会考虑虚拟机的镜像系统怎么连上网的&#xff0c;它的连接方式是什么&#xff0c;它ip是什么&#xff1f; 路由器、交换机和网卡 1.路由器 一般有几个功能&#xff0c;第一个是网关、第二个是扩展有线网络端口、第三个是WiFi功…

ncs sdk nrf5340 运行DFU

nrf5340 运行DFU 1. dfu介绍 Nordic 的 DFU&#xff08;Device Firmware Update&#xff09;是一种用于更新设备固件的技术和协议。Nordic Semiconductor 是一家专门设计和制造无线芯片的公司&#xff0c;他们的产品主要用于物联网&#xff08;IoT&#xff09;和无线连接应用…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

React Native 之 开发环境搭建(一)

1. 安装Node.js&#xff1a; Node.js是React Native开发的基础&#xff0c;因此首先需要安装Node.js。强烈建议始终选择 Node 当前的 LTS &#xff08;长期维护&#xff09;版本&#xff0c;一般是偶数版本&#xff0c;不要选择偏实验性质的奇数版本。 如果你希望更方便地管理…

基于SpringBoot+微信小程序的订餐(点餐)配送系统设计与实现+毕业论文(12000字)

系统介绍 本微信小程序在线订餐系统管理员功能可以修改个人中心&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单信息管理&#xff0c;取消订单管理&#xff0c;订单配送管理&#xff0c;菜品评价管理以及系统管理。微信小程序用户可以…

实训一:设计系统主页作业

1.题目 设计系统主页。 2.目的 (1)熟悉Web前端项目开发环境。 (2)掌握如何建立Web前端项目&#xff0c;学会规划项目结构。 (3)掌握动态生成页面内容的方法。 (4)理解如何使用Flash显示图片新闻。 (5)会在应用系统中编写播放动态新闻的程序。 3.内容 建立项目结构&#xff0c;并…

在excel的内置瀑布图模板中,能在数据标签里同时显示数值和百分比吗?

瀑布图是由麦肯锡顾问公司所创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图( Waterfall Plot)。这种图表常用于表达数个特定数值之间的数量增减变化关系。 在Excel中&#xff0c;瀑布图是可以通过簇状柱形图来完成创建。从excel2016版起&#xff0c;excel添加了内置…

【AIGC】Mac Intel 本地 LLM 部署经验汇总(CPU Only)

书接上文&#xff0c;在《【AIGC】本地部署 ollama(gguf) 与项目整合》章节的最后&#xff0c;我在 ollama 中部署 qwen1_5-14b-chat-q4_k_m.gguf 预量化模型&#xff0c;在非 Stream 模式下需要 89 秒才完成一轮问答&#xff0c;响应速度实在是太慢&#xff0c;后续需要想办法…

IT行业现状与未来趋势-技术创新日新月异

目录 一、引言 二、IT行业现状 技术创新日新月异 市场需求持续增长 人才竞争激烈 网络安全问题凸显 三、IT行业未来趋势 人工智能将更加普及 区块链技术将改变商业模式 网络安全将成为重要战略 数字化转型将加速推进 四、结语 一、引言 随着科技的飞速发展&#x…