RabbitMQ---订阅模型-Fanout
1、 订阅模型-Fanout
Fanout,也称为广播。
流程图:

在广播模式下,消息发送流程是这样的:
1) 可以有多个消费者
2) 每个消费者有自己的queue(队列)
3) 每个队列都要绑定到Exchange(交换机)
4) 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定。
5) 交换机把消息发送给绑定过的所有队列
6) 队列的消费者都能拿到消息。实现一条消息被多个消费者消费
1.1、生产者
两个变化:
1) 声明Exchange,不再声明Queue
2) 发送消息到Exchange,不再发送到Queue
public class Send {private final static String EXCHANGE_NAME = "fanout_exchange_test";public static void main(String[] argv) throws Exception {// 获取到连接Connection connection = ConnectionUtil.getConnection();// 获取通道Channel channel = connection.createChannel();// 声明exchange,指定类型为fanoutchannel.exchangeDeclare(EXCHANGE_NAME, "fanout");// 消息内容String message = "Hello everyone";// 发布消息到Exchangechannel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());System.out.println(" [生产者] Sent '" + message + "'");channel.close();connection.close();}
}
1.2、消费者1
public class Recv {private final static String QUEUE_NAME = "fanout_exchange_queue_1";private final static String EXCHANGE_NAME = "fanout_exchange_test";public static void main(String[] argv) throws Exception {// 获取到连接Connection connection = ConnectionUtil.getConnection();// 获取通道Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");// 定义队列的消费者DefaultConsumer consumer = new DefaultConsumer(channel) {// 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body) throws IOException {// body 即消息体String msg = new String(body);System.out.println(" [消费者1] received : " + msg + "!");}};// 监听队列,自动返回完成channel.basicConsume(QUEUE_NAME, true, consumer);}
}
1.3、 消费者2
public class Recv2 {private final static String QUEUE_NAME = "fanout_exchange_queue_2";private final static String EXCHANGE_NAME = "fanout_exchange_test";public static void main(String[] argv) throws Exception {// 获取到连接Connection connection = ConnectionUtil.getConnection();// 获取通道Channel channel = connection.createChannel();// 声明队列channel.queueDeclare(QUEUE_NAME, false, false, false, null);// 绑定队列到交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");// 定义队列的消费者DefaultConsumer consumer = new DefaultConsumer(channel) {// 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties,byte[] body) throws IOException {// body 即消息体String msg = new String(body);System.out.println(" [消费者2] received : " + msg + "!");}};// 监听队列,手动返回完成channel.basicConsume(QUEUE_NAME, true, consumer);}
}
1.4、 测试
我们应该先启动生产者,否则,先启动消费者时,由于要绑定交换机,此时,交换机并不存在所以会报错。
我们运行两个消费者,然后发送1条消息:



相关文章:
RabbitMQ---订阅模型-Fanout
1、 订阅模型-Fanout Fanout,也称为广播。 流程图: 在广播模式下,消息发送流程是这样的: 1) 可以有多个消费者 2) 每个消费者有自己的queue(队列) 3) 每个队列都要绑定…...
nginx 中新增url请求参数
1、nginx中新增配置: set $args "$args&参数名参数值"; 示例: set $args "$args&demo1cn_yaojin&demo2123123&myip$remote_addr"; location / {add_header Access-Control-Allow-Origin *;add_header Access-Contro…...
[系统] 电脑突然变卡 / 电脑突然** / 各种突发情况解决思路
今天来公司办公,开机之后发现电脑出现各种问题,死机、卡顿、点什么都加载,甚至开一个文件夹要1分钟才能打开,花了2个小时才解决,走了很多弯路,其实早点想通,5分钟就能解决问题,所以打…...
改进YOLO系列:8.添加SimAM注意力机制
添加SimAM注意力机制 1. SimAM注意力机制论文2. SimAM注意力机制原理3. SimAM注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. SimAM注意力机制论文 论文题目:SimAM: A Simple, Parameter-Free Attention Module for Convolutional Neural Network…...
Go与Rust的对比与分析
Rust 和 Go 是两种现代语言,近年来获得了巨大的关注,每种语言都有自己独特的优势和权衡。在这篇文章中,我们将深入探讨 Rust 和 Go 之间的差异,重点关注性能、语言功能和其他关键因素,以帮助您针对您的开发需求做出明智…...
SpingMVC拦截器-异常处理的思路,用户体验不好的地方
1、异常处理机制 1.1 原先我们的异常都是手动的try..catch() 2、他存在着一些缺陷:这里创建了一个Demo的controller,内部有一个show方法: 3、访问内部,我要实现demoshow方法,我们来调用show1和show2的方法: 4、有一…...
【C++设计模式】用动画片《少年骇客》(Ben10)来解释策略模式
2023年8月25日,周五上午 今天上午学习设计模式中的策略模式时,发现这个有点像很多卡通片里面的变身器... #include<iostream>//alien hero是外星英雄的意思 //在《少年骇客》中,主角可以通过变身器变成10种外星英雄 class AlienHero{ …...
软件测试及数据分析处理实训室建设方案
一 、系统概述 软件测试及数据分析处理是软件开发过程中的一项重要测试活动,旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作,以实现整个软件系统的功能和性能。以下是软件测试及数据分析处理的一…...
切换Debian的crontab的nano编辑器
Debian的crontab默认的编辑器是nano,用起来很不习惯,怎么才能转回vim呢? 用以下命令便可: #update-alternatives --config editor 出现以下所示的界面: 而后选择8使用/usr/bin/vim就能够了。 PS:若是你发现你的定时没有生效&…...
Spring Cloud Alibaba-Sentinel--服务容错
1 高并发带来的问题 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络 原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出…...
Stable Diffusion 系列教程 | 如何获得更高清优质的AI绘画
目录 1 高清修复 1.1 原理 1.2 基本操作 1.3 优缺点 2 UpScale 放大脚本 2.1 原理 2.2 基本操作 2.3 优缺点 3 附加功能放大 3.1 原理 3.2 基本操作 3.3 优缺点 优化出图质量,产出更高清,分辨率更高,更有细节的绘画作品呢&#x…...
食品饮料制造行业如何实现数字化转型和工业4.0
随着科技的不断进步和全球产业的不断发展,食品饮料制造行业也正迎来数字化转型和工业4.0的浪潮。这一转型不仅提升了生产效率和质量,还满足了消费者对更健康、更可持续产品的需求。本文将深入探讨食品饮料制造行业在数字化转型和工业4.0方面的趋势、挑战…...
UE学习记录03----UE5.2 使用MVVM示例
1.打开ue5.2新建C项目 2.项目中通过类导向新建C类,父类选择为UMVVMViewModelBase,创建完成会自动打开vs 3.在VS中对新建的类进行宏定义 使用 C 类向导 创建的类声明自动通过 UCLASS() 宏进行处理。 UCLASS() 宏使得引擎意识到这个类的存在,并…...
代码审计-审计工具介绍-DAST+SAST+IAST项目
DASTSASTIAST项目介绍 DAST: 动态应用程序安全测试(Dynamic Application Security Testing)技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定该We…...
网络安全应急响应预案培训
应急响应预案的培训是为了更好地应对网络突发状况,实施演 练计划所做的每一项工作,其培训过程主要针对应急预案涉及的相 关内容进行培训学习。做好应急预案的培训工作能使各级人员明确 自身职责,是做好应急响应工作的基础与前提。应急响应…...
STM32F4X 定时器中断
STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器 定时器(Timer)最基本的功能就是定时,比如定时翻转LED灯,定时向串口发送数据等。除此之外…...
MongoDB +Dataframe+excel透视表
读取MongoDB中的表 from pymongo import MongoClient import pandas as pd client MongoClient(IP地址, 27017)db client[AOI] collection db[表名] #替换为实际的名称 document collection.find({time:{$gte:2023-08-15 15:26:06}})#筛选数据 df pd.DataFrame(list(docu…...
PostgreSQL日期相关
PostgreSQL日期相关 PostgreSQL日期相减得到整数 PostgreSQL日期相减得到整数 天数相减得到整数,执行下面的SQL: select to_number(date_trunc(day,2023-08-18 00:00:00::TIMESTAMP - 2023-08-10 00:00:00::TIMESTAMP INTERVAL 1 day)::text, 9999999…...
C++编程法则365天一天一条(8)const_cast去除cv限定
文章目录 1、使用场景2、关于const_cast的陷阱3、总结const_cast主要用于去除cv限定,且在C++提供的4个类型转换运算符里,只有const_cast可以去除或者添加cv属性。 1、使用场景 用法如下: const_cast< target-type >( expression ) 两个可能是多级指针且指向相同类型…...
某网站DES加密逆向分析实战
文章目录 一、抓包分析二、加密分析一、重写加密 一、抓包分析 分析站点: aHR0cDovL2VpcC5jaGFuZmluZS5jb20v 首先我们提交一下登陆信息: 搜索j_password查看加密函数: 把上图搜索到的encryptPassword函数拿出来分析一下: function encryptP…...
KUKA机器人FSoE安全地址丢了别慌!手把手教你用WorkVisual 6.0找回(附KRC4标准柜地址表)
KUKA机器人FSoE安全地址丢失应急修复指南:WorkVisual 6.0实战全解析 当产线突然报警停机,示教器闪烁"FSoE安全地址丢失"的红色警告时,经验丰富的维护工程师都知道——这往往是EtherCAT网络拓扑结构异常引发的紧急故障。尤其在采用K…...
UCCL:GPU网络传输的性能优化与创新
1. UCCL:GPU网络传输的革命性创新在分布式机器学习训练场景中,GPU集群间的通信效率往往成为制约系统整体性能的关键瓶颈。传统基于TCP/IP的传输协议由于内核协议栈处理和多次数据拷贝等问题,难以满足现代AI训练任务对低延迟和高带宽的严苛要求…...
无碳小车S型走不直?可能是你的转向机构参数没调对(附ProE运动仿真分析)
无碳小车S型轨迹优化:基于ProE运动仿真的转向机构参数调试指南 在大学生工程训练竞赛中,无碳小车的S型轨迹表现往往是决定胜负的关键。许多团队在实物调试阶段都会遇到一个共同难题:明明按照理论计算完成了设计,小车却总是走不出理…...
Keil开发环境下的CANopen与DeviceNet协议实现指南
1. Keil开发工具对CANopen与DeviceNet协议的支持解析作为一名长期使用Keil工具链的嵌入式开发者,我经常遇到关于工业通信协议支持的咨询。最近在开发一个基于STM32的工业控制器时,就遇到了CANopen协议栈实现的问题。这里系统梳理下Keil开发环境对这两种主…...
从U盘到高端SSD:一文搞懂FTL映射表(块/页/混合)的演进与实战选择
从U盘到高端SSD:一文搞懂FTL映射表(块/页/混合)的演进与实战选择 存储设备的性能差异往往隐藏在底层算法的设计哲学中。当你在电商平台对比两款SSD时,是否思考过为什么同样标称1TB容量的产品,价格能相差数倍ÿ…...
方法区内存回收机制与核心引用链深度剖析
在 Java 虚拟机(JVM)的内存管理体系中,方法区(JDK 1.8 及以后具体实现为元空间 Metaspace)的垃圾回收主要聚焦于两部分:废弃的常量池清理以及无用类的卸载(Class Unloading)。由于类…...
Qlib实战:如何用自定义数据(比如可转债)跑通你的量化筛选器?
Qlib实战:从可转债数据到动态筛选策略的全流程解析 在量化投资领域,标准化的股票数据往往难以满足专业投资者的特殊需求。当我们需要处理可转债、加密货币或其他另类资产时,如何将这些非标准数据整合到强大的量化框架中,成为许多开…...
接入 Taotoken 后从账单明细中分析各阶段模型使用占比与成本变化
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 接入 Taotoken 后从账单明细中分析各阶段模型使用占比与成本变化 在项目开发中引入大模型能力后,一个常见的困惑是&…...
别再傻傻分不清!PECL、CML、LVDS三种高速差分接口,硬件工程师选型避坑指南
高速差分接口选型实战:PECL、CML、LVDS的工程化决策指南 当PCB布线密度突破8层板、信号速率迈入Gbps时代,差分接口的选择直接决定系统稳定性。某通信设备厂商曾因误用LVPECL接口导致整批产品EMC测试失败,损失超百万——这类故事在硬件圈屡见不…...
避开这3个坑,你的SAR影像预处理效率翻倍:ENVI SARscape实战心得
避开这3个坑,你的SAR影像预处理效率翻倍:ENVI SARscape实战心得 在遥感数据处理领域,SAR影像因其全天候、全天时的独特优势,已成为地质灾害监测、海洋观测等领域不可或缺的数据源。然而,许多从业者在初次接触ENVI SARs…...
