RabbitMQ系列学习笔记(八)--发布订阅模式

文章目录

  • 一、发布订阅模式原理
  • 二、发布订阅模式实战
    • 1、消费者代码
    • 2、生产者代码
    • 3、查看运行结果

本文参考:
尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq
RabbitMQ 详解
Centos7环境安装Erlang、RabbitMQ详细过程(配图)

一、发布订阅模式原理

image.png
在开发过程中,有一些消息需要不同消费者进行不同的处理,如电商网站的同一条促销信息需要短信发送、邮件发送、站内信发送等。此时可以使用发布订阅模式(Publish/Subscribe),其工作原理如下:

  • 生产者将消息发送给交换机,交换机将消息转发到绑定此交换机的 每个队列 中。
  • 工作队列模式的交换机只能将消息发送给一个队列,发布订阅模式的交换机能将消息发送给多个队列。
  • 发布订阅模式使用 fanout 交换机。

Fanout这种类型非常简单。它是将接收到的所有消息广播到它知道的所有队列中。在系统中可以查看到默认的一些exchange类型,其中就包括fanout类型交换机。
image.png

二、发布订阅模式实战

1、消费者代码

在发布订阅模式下,需要使用fanout类型的交换机,可以选择通过channel.exchangeDeclare()创建,指定类型为fanout,并且需要将交换机与队列进行绑定,形成绑定关系,这样生产者在发送消息到交换机以后,fanout交换机才会把该消息广播发送到各个具有绑定关系的队列。
消费者01代码如下:

/*** Description: 发布订阅模式消费者01*/
public class ReceiveLogs01 {//设置要创建的交换机的名称private static final String EXCHANGE_NAME = "logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();//创建fanout交换机/*** 参数1:交换机名* 参数2:交换机类型* 参数3:交换机是否持久化*/channel.exchangeDeclare(EXCHANGE_NAME, "fanout", false);/** * 生成一个临时的队列 队列的名称是随机的 * 当消费者断开和该队列的连接时,队列自动删除,防止无用队列占用空间*/ String queueName = channel.queueDeclare().getQueue();//将交换机与队列进行绑定(binding)/*** 参数1:队列名* 参数2:交换机名* 参数3:路由关键字,发布订阅模式写""空串即可*/channel.queueBind(queueName, EXCHANGE_NAME, "");System.out.println("等待接收消息,把接收到的消息打印在屏幕上......");//接收消息channel.basicConsume(queueName, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("ReceiveLogs01控制台打印接收到的消息: " + message);}});}
}

消费者02代码如下:

/*** Description: 发布订阅模式消费者02*/
public class ReceiveLogs02 {//设置要创建的交换机的名称private static final String EXCHANGE_NAME = "logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, "fanout", false);String queueName = channel.queueDeclare().getQueue();channel.queueBind(queueName, EXCHANGE_NAME, "");System.out.println("等待接收消息,把接收到的消息打印在屏幕上......");//接收消息channel.basicConsume(queueName, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("ReceiveLogs02控制台打印接收到的消息: " + message);}});}
}

2、生产者代码

由于在消费者中已经完成交换机声明,队列创建及二者之间的绑定关系,因此生产者部分的代码较为简单,只需要在发送消息时指定好前面创建的交换机名称即可。

/*** Description: 发布订阅模式生产者*/
public class EmitLog {//交换机名称private static final String EXCHANGE_NAME = "logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMqUtil.getChannel();//发送消息Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {String message = sc.nextLine();//参数1:指定交换机名称//参数2:指定routingkey,发布订阅模式写""空串即可channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));System.out.println("生产者发出消息" + message);}//关闭资源channel.close();}
}

3、查看运行结果

将ReceiveLogs01和ReceiveLogs02启动,等待接收消息,再启动生产者,通过控制台发送消息。
image.png
消息发送完毕以后,查看两个消费者都接收到了同样的消息,类似广播,而非之前的互斥接收。
image.png
image.png

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

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

相关文章

linux查看系统类型

要确定系统是 Ubuntu 还是 CentOS,可以通过查看系统的发行版信息来判断。以下是几种常见的方法: 方法一:使用 cat 命令查看 /etc/os-release 文件 这个文件包含了系统的详细信息,包括发行版名称和版本号。 cat /etc/os-release…

ESP32-C3实现非易失变量(Arduino IDE )

1效果 网页输入数据&#xff0c;串口打印数据。掉电后数据还在 2源码 #include <WiFi.h> // 包含WiFi库&#xff0c;用于处理WiFi连接 #include <WebServer.h> // 包含WebServer库&#xff0c;用于创建Web服务器 #include <Preferences.h> // 包含Prefere…

告别微信封号!学会这5招,让你的账号坚不可摧

在这个信息爆炸的时代&#xff0c;无论是工作沟通、社交互动还是获取信息&#xff0c;微信都扮演着极其重要的角色。但是&#xff0c;随着微信平台规则的日益严格&#xff0c;账号被封的风险也随之增加。今天&#xff0c;我们就来聊聊如何有效防止 微信被封&#xff0c;让你的账…

【MySQL】入门篇—基本数据类型:NULL值的概念

在关系数据库中&#xff0c;NULL值是一个特殊的标记&#xff0c;表示缺失或未知的值。 NULL并不等同于零&#xff08;0&#xff09;或空字符串&#xff08;&#xff09;&#xff0c;它表示一个字段没有任何值。 这一概念在数据库设计和数据管理中至关重要&#xff0c;因为它影…

力扣——环形链表问题

判断链表是否有环以及入环的第一个节点 前言判断链表是否有环找到入环的第一个节点 前言 大家好&#xff0c;前段时间&#xff0c;熊二学习了关于环形链表相关的问题&#xff0c;以下是我的见解&#xff0c;希望能够帮助你们呀&#xff01; 判断链表是否有环 给定一个链表&am…

如何在一个月内快速学习掌握大模型

原本给自己的是一个月时间&#xff0c;通过梳理之后我自信的认为不需要一个月&#xff0c;两周即可&#xff0c;相较于其他技术&#xff0c;大模型应用的门槛要低得多。 先明确你想要深入到哪一层 1、基础设施层&#xff1a;了解即可&#xff0c;关注NVIDIA和超大规模厂商的最…

[自动化测试:Selenium]:环境部署和Webdriver的使用

文章目录 修改安装源打开Python Packages。点击梅花按钮。在弹出的对话框中&#xff0c;填入Name&#xff08;随便填&#xff09;&#xff0c;Repository URL&#xff0c;选择下列的源&#xff0c;一般先选择清华源按OK确认。配置完成 安装seleniumFile→Settings→Project&…

多签机制简明理解及实例说明

目录 Multisignature机制简明理解及实例说明 Multisignature机制中的公钥、私钥、Nonce及签名验签详解 加密货币托管账户的多重签名机制 Multisignature机制简明理解及实例说明 一、基本概念 Multisignature(多重签名)机制是一种先进的加密技术,它允许一笔交易必须由多…

word删除空白页 | 亲测有效

想要删掉word里面的末尾空白页&#xff0c;但是按了delete之后也没有用 找了很久找到了以下亲测有效的方法 1. 通过鼠标右键在要删除的空白页面处显示段落标记 2. 在字号输入01&#xff0c;按ENTER&#xff08;回车键&#xff09; 3.成功删除了&#xff01;&#xff01; PS…

【ArcGIS Pro实操第八期】绘制WRF三层嵌套区域

【ArcGIS Pro实操第八期】绘制WRF三层嵌套区域 数据准备ArcGIS Pro绘制WRF三层嵌套区域Map-绘制三层嵌套区域更改ArcMap地图的默认显示方向指定数据框范围 Map绘制研究区Layout-布局出图 参考 本博客基于ArcGIS Pro绘制WRF三层嵌套区域&#xff0c;具体实现图形参考下图&#x…

两性离子水凝胶助力微针传感器:稳定灵敏的监测神器

大家好&#xff01;今天我要向大家介绍一项关于生物相容性核壳微针传感器的研究——《Biocompatible Core–Shell Microneedle Sensor Filled with Zwitterionic Polymer Hydrogel for Rapid Continuous Transdermal Monitoring》发表于《ACS Nano》&#xff0c;该传感器填充两…

力扣每日打卡挑战 3184. 构成整天的下标对数目 I

给你一个整数数组 hours&#xff0c;表示以 小时 为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如&#xff0c;1 天是 24 小时&#xff0c…

深入解析 Golang 并发编程中的同步机制:WaitGroup 与 Mutex 详解

文章目录 一、简介二、WaitGroup 的使用1. 什么是 WaitGroup&#xff1f;2. 基本操作3. WaitGroup 示例4. 注意事项 三、Mutex 的使用1. 什么是 Mutex&#xff1f;2. 基本操作3. Mutex 示例 四、竞争条件示例与解决1. 竞争条件问题示例2. 使用 Mutex 解决竞争条件 五、使用 RWM…

FFMPEG录屏(19)--- 枚举Windows下的屏幕列表,并获取名称、缩略图

在Windows下枚举显示器列表并获取名称、缩略图 在Windows系统中&#xff0c;枚举显示器列表并获取它们的名称和缩略图是一个常见的需求。本文将详细介绍如何实现这一功能&#xff0c;涉及到的主要技术包括Windows API和C编程。 获取显示器信息 首先&#xff0c;我们需要一个…

爬虫结合项目实战

由于本人是大数据专业&#xff0c;所以准备的是使用pycharm工具进行爬虫爬取数据&#xff0c;然后实现一个可视化大屏 参考项目&#xff1a; 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包&#xff1a;

自由学习记录(13)

服务端常见的“资源” 在服务端&#xff0c;常见的“资源”指的是服务端提供给客户端访问、使用、处理或操作的各种数据和功能。根据不同类型的服务和应用场景&#xff0c;服务端的资源种类可以非常广泛。以下是一些常见的服务端资源类型&#xff1a; 1. 文件和静态资源 网页…

LSP的建立

MPLS需要为报文事先分配好标签&#xff0c;建立一条LSP&#xff0c;才能进行报文转发。LSP分为静态LSP和动态LSP两种。 静态LSP的建立 静态LSP是用户通过手工为各个转发等价类分配标签而建立的。由于静态LSP各节点上不能相互感知到整个LSP的情况&#xff0c;因此静态LSP是一个…

阿里云云盘在卸载时关联到PHP进程,如何在不影响PHP进程情况下卸载磁盘

1.问题&#xff1a; 在使用umount /dev/vdc1 卸载磁盘时&#xff0c;提示如下&#xff0c;导致无法在Linux系统下卸载磁盘 umount /dev/vdc1 umount: /var/www/html/*/eshop/IFile3: target is busy.(In some cases useful info about processes that usethe device is found…

NumPy学习Day18

1.数据迭代 1.1 nditer 使用np.nditer(x,order)遍历数组x中的元素 x为需要遍历的数组orderc’时按照行优先遍历orderf’时按照列优先遍历 1.2 flags参数 flags可以返回数组中元素的多维索引&#xff08;类似矩阵的坐标&#xff09; multi_index: 返回每个元素的多维索引。…

工具类的构造方法为什么要用private修饰

工具类&#xff08;Utility Class&#xff09;通常被设计为包含静态方法和静态变量的类&#xff0c;可以使用类名.方法名直接调用&#xff0c;不用进行实例化&#xff0c;这是工具类的设计原则&#xff0c;所以构造方法用private修饰&#xff08;因为公开的方法可以被实例化&am…