RabbitMQ五种消息模型

news2024/11/19 10:44:26

文章目录

  • 1.简单消息队列模型
  • 2.Work工作队列模型
  • 3.发布订阅模型
    • 3.1.Fanout广播
    • 3.2.Direct路由
    • 3.3.Topics通配符

RabbitMQ官方文档
RabbitMQ 提供了5种常用消息模型。但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。
在这里插入图片描述
在这里插入图片描述

1.简单消息队列模型

简单消息队列官方文档

1、创建简单消息队列

在这里插入图片描述

2、导入依赖

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

3、编写生产者测试类SpringAmqpTest,并利用 RabbitTemplate 实现消息发送

@SpringBootTest
public class SpringAMQPTest {
	//SpringAMQP提供的三个功能之一:封装了 RabbitTemplate 工具,用于发送消息 (生产者)
    @Autowired
    private RabbitTemplate template;

    @Test
    void test(){
    	//利用RabbitTemplate提供的方法向指定队列发送消息
        template.convertAndSend("simple.queue","Hello SpringAQMP!");
    }
}

4、编写消费者,监听队列消息

@Component
public class MessageListener {
	  /**
     * SpringAMQP提供的三个功能之二:基于注解的监听器模式,异步接收消息 (消费者)
     * @RabbitListener是SpringAMQP提供的监听消息队列的注解
     * @param message
     */
    @RabbitListener(queues = "simple.queue")
    public void basicQueueListener(String message) {
        System.out.println("消费者接收到消息:" + message);
    }
}

在这里插入图片描述

5、编写生产者和消费者的application.yml文件

spring:
  rabbitmq:
    host: 192.168.6.131
    port: 5672
    # 虚拟主机
    virtual-host: /
    username: rabbitmq
    password: 123456

在这里插入图片描述

6、测试

运行生产者代码后,simple.queue 队列中产生了一条待消费的消息。
在这里插入图片描述
运行消费者代码后,队列中的消息被消费
在这里插入图片描述
在这里插入图片描述

2.Work工作队列模型

work工作队列官方文档

1、 创建 work.queue 队列

在这里插入图片描述

2、创建生产者测试类

    @Test
    void testWorkQueue(){
        String queueName = "work.queue";
        String message = "Hello SpringAQMP-";
        for (int i = 0; i < 20; i++) {
            template.convertAndSend(queueName,message+i);
        }
    }

3、创建消费者测试类

    @RabbitListener(queues = "work.queue")
    public void workQueueListener01(String message) throws InterruptedException {
        System.out.println("消费者01接收到消息:" + message + " - " + LocalTime.now());
        Thread.sleep(20);
    }
    @SneakyThrows
    @RabbitListener(queues = "work.queue")
    public void workQueueListener02(String message){
        System.out.println("消费者02接收到消息:" + message + " - " + LocalTime.now());

4、修改消费者的application.yml

正常情况下每个消费者要消费的消息数量是一样的。消息是平均分配给每个消费者,并没有考虑到消费者的处理能力。这样显然不合理,因此修改消费者的配置文件使得每个消费者按照能力顺序处理信息

spring:
  rabbitmq:
    listener:
      simple: # 简单队列和work队列的配置
        prefetch: 1 # 每次只能获取一条消息,处理完成才获取下一条消息

5、测试

运行生产者和消费者类,两个消费者收到的同一个队列中的消息肯定是不一样的。
在这里插入图片描述

3.发布订阅模型

在发布订阅模型中,多了一个exchange角色,而且过程略有变化:

  • producer:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)

  • exchange:交换机,一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于exchange的类型。exchange 有以下3种类型:

    • fanout:广播,将消息交给所有绑定到交换机的队列
    • direct:定向,把消息交给符合指定 routing key 的队列
    • topic:通配符,把消息交给符合 routing pattern 的队列
  • consumer:消费者,订阅队列

  • queue:消息队列,接收消息、缓存消息。

exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 exchange 绑定,或者没有符合路由规则的队列,那么消息会被丢弃!
在这里插入图片描述

3.1.Fanout广播

Fanout广播官方文档
在这里插入图片描述

在广播模式下,消息发送流程是这样的:

  • 可以有多个消费者

  • 每个消费者有自己的queue(队列)

  • 每个队列都要绑定到Exchange(交换机)

  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。

  • 交换机把消息发送给绑定过的所有队列

  • 队列的消费者都能拿到消息。实现一条消息被多个消费者消费

  • 使用内置的 amq.fanout 交换机
    在这里插入图片描述

  • 两个队列不用手动创建,是在下面

1、创建生产者测试类

@Test
void testFanoutExchange() {
    rabbitTemplate.convertAndSend("amq.fanout", "", "Hello amq.fanout");
}

2、创建消费者测试类


@Component
public class SpringRabbitListener {
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue01"),
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener01(String message) {
        System.out.println("消费者01接收到fanout.queue01的消息:" + message);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "fanout.queue02"),//使用@Queue(name = "fanout.queue01")RabbitMQ自动生成队列
            exchange = @Exchange(name = "amq.fanout", type = ExchangeTypes.FANOUT)
    ))
    public void fanoutQueueListener02(String message) {
        System.out.println("消费者02接收到fanout.queue02的消息:" + message);
    }
}

3、测试

运行生产者和消费者
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2.Direct路由

Direct路由官方文档
在这里插入图片描述
在 Fanout 模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到 direct 类型的 exchange。

Direct模型下:

  • 队列与交换机的绑定要指定一个 RoutingKey
  • 消息的发送方在向 exchange 发送消息时,也必须指定消息的 RoutingKey。
  • exchange 不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey 与消息的 Routing key 完全一致,才会接收到消息

1、创建生产者测试类

@Test
void testDirectExchange() {
    rabbitTemplate.convertAndSend("amq.direct", "save", "新增通知");
    rabbitTemplate.convertAndSend("amq.direct", "delete", "删除通知");
}

2、创建消费者测试类

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue01"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"save"}
))
// 处理新增的业务
public void directQueueListener01(String message){
    System.out.println("消费者01接收到direct.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue02"),
    exchange = @Exchange(name = "amq.direct", type = ExchangeTypes.DIRECT),
    key = {"delete"}
))
// 处理删除的业务
public void directQueueListener02(String message){
    System.out.println("消费者02接收到direct.queue02的消息:" + message);
}

3、测试

运行生产者和消费者测试类
在这里插入图片描述
在这里插入图片描述

3.3.Topics通配符

Topics通配符官方文档
在这里插入图片描述
Topics 类型的 Exchange 与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列。

不同的是 Topic类型的 Exchange 可以让队列在绑定 Routingkey 的时候使用通配符

通配符规则:

  • #:匹配一个或多个单词

  • *:匹配一个单词

举例:

  • user.#:能够匹配 user.add 或者 user.detail.add

  • user.*:只能匹配 user.add

1、创建生产者测试类

@Test
public void testTopicExchange() {
    rabbitTemplate.convertAndSend("amq.topic", "user.add", "新增用户通知");
    rabbitTemplate.convertAndSend("amq.topic", "user.update", "更新户通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.add", "新增部门通知");
    rabbitTemplate.convertAndSend("amq.topic", "dept.update", "更新部门通知");
}

2、创建消费者测试类

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue01"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "user.*"
))
public void topicQueueListener01(String message){
    System.out.println("消费者01接收到topic.queue01的消息:" + message);
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue02"),
    exchange = @Exchange(name = "amq.topic", type = ExchangeTypes.TOPIC),
    key = "dept.*"
))
public void topicQueueListener02(String message){
    System.out.println("消费者02接收到topic.queue02的消息:" + message);
}

3、测试

运行生产者和消费者测试类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Midjourney提示词资源、使用技巧、艺术家资源网站收录

为了帮助艺术家们使用Midjourney更专业、准确地创作更完美的艺术作品&#xff0c;我们收录了一些Midjourney提示词资源分享、提示词书写技巧、相关专业工具&#xff0c;同时还有一些相关艺术家资源帮艺术家们找到创作灵感。有很多是社区内资深玩家分享的云文档&#xff0c;资源…

【机器视觉3】双目立体视觉模型

双目立体视觉模型 简单模型一般模型 简单模型 假设两个摄像机平行放置于同一高度、光轴平行、成像平面重合、焦距相同、左右图像每一行y坐标方向、大小相同&#xff0c;如下图所示&#xff1a; 由左右成像平面上的点、目标物点、焦距、摄像机中心基线距离的几何关系可以得到&…

MySQL学习指南笔记经典案例句

作者&#xff1a;BSXY_19计科_陈永跃 BSXY_信息学院 注&#xff1a;未经允许禁止转发任何内容 该文章是一篇关于MySQL的一个学习的笔记或是指南&#xff0c;该文章中有很多的经典的案例可进行相应的练习和参考&#xff0c;后期的话会持续更新关于数据库系统方面的文章。 MySQL学…

供应商评估:关键标准以及如何执行

几乎每个行业的企业都与制造商、进口商、服务提供商和分销商等供应商合作。由于通常有几个供应商可供选择&#xff0c;进行供应商评估有助于企业选出其中最符合其业务需求的供应商。 什么是供应商评估&#xff1f; 供应商评估是企业在为其产品或材料选择供应商时使用的过程。…

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…

iOS swift5 获取系统或其他app已经连接的蓝牙设备

文章目录 chatGPT答案1.2 retrievePeripheralsWithIdentifiers 本人实例参考博客 chatGPT答案 1.1 retrieveConnectedPeripherals(withServices (本人没有测试成功) 要获取系统或其他app已连接的蓝牙设备&#xff0c;你可以使用CoreBluetooth框架提供的CBCentralManager类。下…

【节点边际电价】机组运行约束对机组节点边际电价的影响分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

新人如何学习软件测试

零基础学习软件测试不失为一个好的选择&#xff0c;虽然IT行业里对小白最友好的非软件测试莫属了&#xff0c;但是也要看你个人在学习软件测试这件事上面花费了多少的时间和努力了~ 每年毕业季&#xff0c;IT行业依然是比较热门且收入是最高的行业。对于应届毕业生来说想要进入…

Unity3d 开发Pico4应用打开工程卡在Importing(iteration xxx) busy for xx:xx)...问题记录

问题 大致问题如题&#xff1a; 步骤是参照了PICO官方给出的快速开始的步骤进行的&#xff0c;而这个我问题的出现是在导入 PICO Unity Integration SDK 前往 SDK 下载中心&#xff0c;下载最新版本的 SDK。 1.解压所下载的 SDK 压缩包。 2.你将会得到一个包含 package.json…

微服务圣经1:零基础搭建一套SpringCloud微服务脚手架(SpringCloud+Dubbo+Docker+Jenkins)

说在前面 在40岁老架构师尼恩的读者社群&#xff08;50&#xff09;中&#xff0c;大量的小伙伴是架构师、高级开发&#xff0c;大家都有丰富的开发、架构经验。 在开发过程中&#xff0c;一般情况下&#xff0c;大家都是用现有的开发框架。 导致的一个严重问题是&#xff1…

全网独家首发最牛最全面的JMeter使用BeanShell断言

BeanShell简介 BeanShell是使用Java语法的一套脚本语言&#xff0c;在JMeter的多种组件中都有BeanShell的身影&#xff0c;如&#xff1a; 定时器&#xff1a;BeanShell Timer前置处理器&#xff1a;BeanShell PreProcessor采样器&#xff1a;BeanShell Sampler后置处理器&am…

JAVA - 字符串工具类StringBuilder和StringBuffer

文章目录 目录 文章目录 前言 二.常用方法演示 1.append()用于将指定的字符串添加到当前StringBuilder对象的末尾 2.delete()&#xff1a;用于删除StringBuilder对象中指定位置的字符。 3.insert()&#xff1a;用于在指定位置插入指定字符串。 4.replace()&#xff1a;用于替换…

YOLOv5【detect.py源码及参数】超详细注释解读!!!建议收藏✨✨!

之前的文章介绍了YOLOv5的网络结构&#x1f680;与目录结构源码&#x1f680;的详细解读&#xff0c;今天带来的是YOLOv5的 detect.py 代码逐行解读以及注释&#xff0c;废话不多说&#xff0c;让我们一起学习YOLOv5的 detect.py 源码吧&#xff01; YOLOv5所使用版本&#xf…

RocketMQ介绍

一、MQ简介 1.1 项目工程弊端 1.2 MQ简介 MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是一种用来保存消息数据的队列 队列&#xff1a;数据结构的一种&#xff0c;特征为 “先进先出” 何为消息: 服务器间的业务请求 原始架构&#xff1a; 服务器中的A功能…

Java并发编程:并发问题和多线程技术的应用和优化

章节一&#xff1a;引言 在当今的软件开发领域中&#xff0c;多线程编程是一项至关重要的技术。随着处理器核心数量的增加和计算机系统的并行性的不断提高&#xff0c;充分利用多核心处理器的能力已成为现代软件开发的关键要素之一。Java作为一种强大的编程语言&#xff0c;在…

MobPush Flutter平台插件

集成准备 注册账号 使用PushSDK之前&#xff0c;需要先在MobTech官网注册开发者账号&#xff0c;并获取MobTech提供的AppKey和AppSecret&#xff0c;详情可以点击查看注册流程 MobPush后台配置 注册MobTech账号后&#xff0c;需要在MobTech后台进行相关信息的配置&#xff…

信息学算法竞赛中一种特殊的数据读入方式

在算法竞赛中&#xff0c;有时会出现一些特殊的数据读入&#xff0c;比如每行的数据元素个数不确定&#xff0c;更复杂一些的是连续多行的数据个数不确定。单行的不确定元素个数的读入可以借助 w h i l e ( while( while(~ s c a n f ( ) ) scanf()) scanf())或 w h i l e ( c …

简单实现小程序授权登录功能

本人给大家带来了关于微信小程序的相关知识&#xff0c;其中主要介绍了怎么实现小程序授权登录功能的相关内容&#xff0c;下面一起来看一下&#xff0c;希望对大家有帮助。 在我们平时工作、学习、生活中&#xff0c;微信小程序已成为我们密不可分的一部分&#xff0c;我们仔细…

【Java】记录一次服务性能问题定位、调优完整过程

文章目录 背景压测准备初步压测结论 排查过程记录排除中间件及网络因素借助Arthas及Skywalking暴露prometheus指标修改数据库最大连接池数场景一场景二场景三场景四场景五场景六场景七场景八结论 Consumer消费能力优化增加消费者增加Topic Queue数量Queue总数&#xff1a;96Que…

Redis:哨兵模式——可以理解为主从复制的升级版

如果不懂什么是主从复制&#xff0c;可以看我的上一篇文章&#xff0c;这一篇文章与上一篇文章息息相关&#xff0c;可以先去大概去了解一下。 Redis:主从复制_通过此功能实现对内存上的数据更好的保护_不想睡醒的梦的博客-CSDN博客 什么是哨兵模式&#xff1f; 上一篇文章主…