RabbitMQ( 发布订阅模式 ==> FanoutExchange )

news2025/1/21 3:01:03

本章目录:

  • 何为发布订阅模式
  • FanoutExchange具体使用

一、何为发布订阅模式

在上一篇文章中,我们创建了Work Queue并且发送任务,在Work Queue中,每个任务只会被一个消费者消费,任务消费后就被清除了。

而在本篇中,我们将做一些完全不同的事情——我们将向多个消费者传递消息。这种模式被称为“发布/订阅”

我们先看看其模式图

该模式核心思想如下:

是生产者从不直接向队列发送任何消息。实际上,生产者通常根本不知道消息是否会被传递到任何队列。

相反,生产者只能向交换器发送消息(图片上的蓝色圆圈)。交换是一件非常简单的事情。一方面,它接收来自生产者的消息,另一方面,它将消息推送到队列。交换器必须确切地知道如何处理接收到的消息。它应该被附加到特定的队列中吗?它应该被添加到多个队列中吗?还是应该被丢弃?其规则由交换类型定义

本章主要学习FanoutExchange,它只是将接收到的所有消息广播给它所知道的所有队列,也称为广播

二、 FanoutExchange具体使用

在消费者服务内新建config配置类,我们需要声明

  • 交换机
  • 队列
  • 交换机与队列绑定

config如下:

@Configuration
public class FanoutConfig {
    ///声明交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("brrbaii.fanout");
    }

    //声明队列
    @Bean("queueA")
    public Queue fanoutQueueA(){
        return new Queue("brrbaii.queueA");
    }

    @Bean("queueB")
    public Queue fanoutQueueB(){
        return new Queue("brrbaii.queueB");
    }

    //绑定队列A
    @Bean
    public Binding fanoutBindingA(@Qualifier("queueA")Queue qA,FanoutExchange fanoutExchange){
        //我们将绑定多个队列,这里按byName注入
        return BindingBuilder
                .bind(qA)
                .to(fanoutExchange);
    }
    //绑定队列A
    @Bean
    public Binding fanoutBindingB(@Qualifier("queueB")Queue qB,FanoutExchange fanoutExchange){
        //我们将绑定多个队列,这里按byName注入
        return BindingBuilder
                .bind(qB)
                .to(fanoutExchange);
    }
}

接着声明消费者,分别接听两个队列

@Component
public class SpringRabbitMQListener {

    @RabbitListener(queues = "brrbaii.queueA")
    public void listenFanoutQueueA(String msg) {
        System.out.println("queueA:"+msg);

    }

    @RabbitListener(queues = "brrbaii.queueB")
    public void listenFanoutQueueB(String msg) {
        System.out.println("queueB:"+msg);
    }

发送消息

观察结果,两个队列都收到了消息,完成了向多个消费者传递消息



我们也可以不声明配置类,采用注解完成队列和交换机的绑定

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueA"),
            exchange = @Exchange(name = "brrbaii.fanout")
    ))
    public void lA(String msg){
        System.out.println("queueA"+msg);
    }

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "brrbaii.queueB"),
            exchange = @Exchange(name = "brrbaii.fanout")
    ))
    public void lB(String msg){
        System.out.println("queueA"+msg);
    }

 

 

 

 

 

 

 

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

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

相关文章

0202心跳和服务续约源码解析-nacos2.x-微服务架构

文章目录1 客户端心跳任务2 服务端处理2.1 服务注册时开启客户端心跳检查2.2 客户端发送心跳任务续约2.3 服务实例移除2.4 心跳任务闭环结语1 客户端心跳任务 在上一篇文章0201服务注册源码解析-nacos2.x-微服务架构分析客户端服务注册的时候,流程在NacosNamingSer…

重装系统下载网址

[置顶]无论会不会安装系统,都一定会需要,觉得内容不错欢迎一键三连哦 稳定 | 方便 | 好用 1、MSDN 用过最简单好用,下载不限速,支持迅雷、IDM多种下载方式 https://www.xitongku.com 2、Windows系统下载仓储站 为小白重装系统提供…

KIOPTRIX: LEVEL 4通关详解

环境配置 vulnhub上下载的文件没有vmx 去3的文件里偷一个 记事本打开把所有Kioptrix3_vmware改成Kioptrix4_vmware 然后网卡地址随便改一下 打开后会提示找不到虚拟机,手动选一下就行了 信息收集 漏洞发现 web一上去就是一个登录框 扫路径发现database.sql 但是密码是错的…

高通开发系列 - linux arm64 toolchain交叉编译器编译错误

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述下载aarch64交叉编译器编译使能编译环境使能defconfig编译问题1:address-of-packed-member问题2:attribute-alias=问题3:array…

Kubernetes 笔记(14)— 滚动更新、定义应用版本、实现应用更新、管理应用更新、添加更新描述

滚动更新,使用 kubectl rollout 实现用户无感知的应用升级和降级。 1. 定义应用版本 在 Kubernetes 里,版本更新使用的不是 API 对象,而是两个命令:kubectl apply 和 kubectl rollout,当然它们也要搭配部署应用所需要…

人工智能作业之遗传算法

遗传算法1.遗传算法定义2.相关术语3.遗传算法的主要步骤4.遗传算法的参数设计原则5.代码实现1.遗传算法定义 遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法&am…

java 婚恋交友网站Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 婚恋交友网站是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

IMX6ULL学习笔记(22)——eLCDIF接口使用(TFT-LCD屏显示)

一、TFT-LCD简介 TFT-LCD(Thin Film Transistor-Liquid Crystal Display) 即薄膜晶体管液晶显示器。TFT-LCD 与无源 TN-LCD、 STN-LCD 的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT)&#…

智慧网点解决方案 | 助推银行“营销-销售-服务”一体化建设

传统网点的智慧化变革已成为新形势下银行创新业务服务模式与产品、优化客户体验、提质增效的一大阵地。如何在网点转型过程中充分发挥边缘计算等新技术的价值,引领行业数字化转型新趋势,成为银行业面临的共同课题。 在传统银行网点向智慧网点的转型过程…

基于Java+SpringBoot+vue的家具销售电商平台设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(300套) 目录 一、效果演示 二、…

真00后整顿职场?公司新来了个00后卷王,3个月薪资干到20K.....

最近聊到软件测试的行业内卷,越来越多的转行和大学生进入测试行业。想要获得更好的待遇和机会,不断提升自己的技能栈成了测试老人迫在眉睫的问题。 不论是面试哪个级别的测试工程师,面试官都会问一句“会编程吗?有没有自动化测试…

Redis基础总结-redis简介

Redis基础Redis基础目标:1. Redis 简介1.1 NoSQL概念1.1.1 问题现象1.1.2 NoSQL的概念1.2 Redis概念1.2.1 redis概念1.2.2 redis的应用场景1.3 Redis 的下载与安装1.3.1 Redis 的下载与安装1.4 Redis服务器启动1.4.1 Redis服务器启动1.4.2 Redis客户端启动1.4.3 Red…

数字化转型迫在眉睫!药企如何应用AI技术加速创新?

导语 | 近年来,随着 AI 等技术的发展应用,数字化、智能化日渐成为各行各业转型升级的新兴力量,其与医药产业的融合创新也逐渐成为当前的新趋势,众多医药制造企业蓄势待发,搭乘数字化的快车,驶入高速发展的快…

论文笔记:Fully Convolutional Networks for Semantic Segmentation

摘要 卷积网络是产生特征层次结构的强大视觉模型。我们展示了卷积网络本身,经过端到端、像素到像素的训练,超过了语义分割的最新技术水平。我们的主要见解是构建“全卷积”网络,该网络接受任意大小的输入并通过有效的推理和学习产生相应大小…

css的font-size属性、line-height属性、height属性

目录 一,字体框 二、font-size属性 三、line-height属性 四、line-height和font-size的联系 简介:font-size是css中关于字体的样式属性,注意与文本属性text-xxx进行区别。因为文本由一个个字符组成,所以字体属性也会对文本属性…

海伦司的酒何时“醒”

被年轻人喝出来的“酒馆第一股”海伦司,目前正经历疯狂开店之后的阵痛。 3月24日,海伦司国际控股有限公司(下称“海伦司”,09869.HK)发布了2022年的业绩报告。 海伦司是一家连锁酒馆品牌,其年报公布后的首个交易日,其股价跌幅达…

Qt5.12實戰之Qt調用Linux靜態庫(.a)與動態庫(.so)

1.準備編譯好的靜態庫,複製到lib目錄 ,動態庫複製到bin目錄 2.創建Qt控制臺應用,並添加靜態庫引用 右擊工程名call_liba,選擇添加擴展庫 選擇要添加的libtest.a 然後 點擊 OPEN 點擊Next後會自動添加靜態庫相關引用 到工程 的.pro文件 中 生…

OpenCV实例(五)指纹识别

OpenCV实例(五)指纹识别1.指纹识别概述1.1概述1.2原理2.指纹识别算法2.1特征提取2.2MCC匹配方法2.3尺度不变特征变换(SIFT)3.显示指纹的关键点4.基于SIFT的指纹识别作者:Xiou 1.指纹识别概述 1.1概述 指纹识别&…

程序设计方法学

体育竞技分析 问题分析 体育竞技分析 需求:毫厘是多少? 如何科学分析体育竞技比赛? 输入:球员的水平 输出:可预测的比赛成绩 体育竞技分析:模拟N场比赛 计算思维:抽象 自动化 模拟&am…

QML控件--Menu

文章目录一、控件基本信息二、控件使用三、属性成员四、成员函数一、控件基本信息 二、控件使用 import QtQuick 2.10 import QtQuick.Window 2.10 import QtQuick.Controls 2.3ApplicationWindow{visible: true;width: 1280;height: 720;Button {id: fileButtontext: "Fi…