RabbitMQ消息模型之Fanout消息模型

Fanout消息模型

* 广播模型:
    *  一个交换机绑定多个队列
    *  每个队列都有一个消费者
    *  每个消费者消费自己队列中的消息,每个队列的信息是一样的
生产者
package com.example.demo02.mq.fanout;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 8:24 AM
 * @version 1.0
 * @description: 广播模型发送者
 *
 * 广播模型:
     *  一个交换机绑定多个队列
     *  每个队列都有一个消费者
     *  每个消费者消费自己队列中的消息,每个队列的信息是一样的
 */
public class FanoutSender {
    public static void main(String[] args) throws Exception {
        // 1:获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 2:创建通道
        Channel channel = connection.createChannel();
        // 3:声明交换机
        // 参数1:交换机名称 参数2:交换机类型 (fanout direct topic) 参数3:是否持久化
        /*
            fanout:广播模式
                绑定了这个交换机的队列都会收到消息
            direct:路由模式
                通过路由键完全匹配的队列会收到消息
            topic:通配符模式
                通过通配符匹配的队列会收到消息
        */
        channel.exchangeDeclare("fanout.exchange", BuiltinExchangeType.FANOUT,false);
        // 交换机不会存储消息,只是负责消息的转发,如果没有队列绑定到交换机上,消息会丢失
        // 4:发送消息到交换机:需要消费信息的消费者自己声明自己的队列绑定到当前交换机上
        String msg = "fanout message";
        channel.basicPublish("fanout.exchange", "", null, msg.getBytes());
        // 5:关闭通道
        channel.close();
        // 6:关闭连接
        connection.close();
    }
}
消费者1
package com.example.demo02.mq.fanout;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 8:55 AM
 * @version 1.0
 * @description: 广播模型接收者
 */
public class FanoutReceiver1 {
    public static void main(String[] args) throws Exception {
        // 1:获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 2:创建通道
        Channel channel = connection.createChannel();
        // 3:声明交换机
        //为什么消费者也得声明交换机?如果消费者先启动,那么交换机还没有声明,消费者就会报错,所以消费者也得声明交换机
        // 参数1:交换机名称 参数2:交换机类型 参数3:是否持久化
        channel.exchangeDeclare("fanout.exchange", BuiltinExchangeType.FANOUT,false);
        // 4:声明队列
        // 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:其他参数
        channel.queueDeclare("fanout.queue1", false, false, false, null);
        // 5:绑定自己的队列到交换机
        channel.queueBind("fanout.queue1", "fanout.exchange", "");
        // 6:消费消息
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            // 参数1:消费者标签 参数2:消息传递参数 参数3: 参数4:消息内容
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                // 消费消息
                System.out.println("Fanout1接收到的消息是:" + new String(body));
                // 手动确认消息
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("fanout.queue1",false,consumer);
    }
}
消费者2
package com.example.demo02.mq.fanout;

import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @author Allen
 * 4/11/2024 8:55 AM
 * @version 1.0
 * @description: 广播模型接收者
 */
public class FanoutReceiver2 {
    public static void main(String[] args) throws Exception {
        // 1:获取连接
        Connection connection = ConnectionUtils.getConnection();
        // 2:创建通道
        Channel channel = connection.createChannel();
        // 3:声明交换机
        //为什么消费者也得声明交换机?如果消费者先启动,那么交换机还没有声明,消费者就会报错,所以消费者也得声明交换机
        channel.exchangeDeclare("fanout.exchange", BuiltinExchangeType.FANOUT,false);
        // 4:声明队列
        // 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:其他参数
        channel.queueDeclare("fanout.queue2", false, false, false, null);
        // 5:绑定队列到交换机
        channel.queueBind("fanout.queue2", "fanout.exchange", "");
        // 6:消费消息
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            // 参数1:消费者标签 参数2:消息传递参数 参数3: 参数4:消息内容
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {

                // 消费消息
                System.out.println("Fanout2接收到的消息是:" + new String(body));
                // 手动确认消息
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        channel.basicConsume("fanout.queue2",false,consumer);
    }
}
结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年金融贷款骗局套路之一

源地址:2023年金融贷款骗局套路之一_预防网贷套路_计算机技术网 随着无卡消费的日夜流行,三年疫情出现,钱难寻,难找的尴尬境地,贷款骗局也出现不少。今天我们讲讲最近很流行的贷款骗局之一中的一种贷款骗局。 在平常…

C++设计模式|0.前言

1.什么是设计模式? 简答来说,设计模式就是一套好用的代码经验总结,也就是怎么写好代码的方法论。使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。 2.设计模式的分类 设计模式可以分为三类:创建型、…

【Unity渲染】渲染管线原理

整理自B站UPKerry佬的视频【【教程】技术美术入门:渲染管线概述】 https://www.bilibili.com/video/BV1Q54y1G7v3/?share_sourcecopy_web&vd_source7e6249c05fba6efe32e8867373f75917 应用阶段 、几何阶段顶点处理、光栅化、片元处理、输出合并 应用阶段是CUP…

WebSocket一篇讲清楚

文章目录 WebSocket简介WebSocket与HTTP的区别WebSocket的工作原理WebSocket的应用场景WebSocket的使用WebSocket 属性WebSocket 事件WebSocket 方法 WebSocket的心跳机制WebSocket 的安全性和跨域问题如何处理?有哪些好用的客户端WebSocket第三方库总结 WebSocket简…

2024年 Mathorcup高校数学建模竞赛(B题)| 甲骨文识别 | 特征提取,图像分割解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长,就读于上海交通大学,截至目前已经帮200人完成了建模与思路的构建的处理了~ 本篇文章是鹿鹿学长经过深度思考,独辟蹊径,通过神经网络解决甲骨文识别问题。结合特征提取,图像分割等多元算法&…

如何在Windows通过固定tcp公网地址ssh远程访问本地Kali Linux

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 本文主要介绍如何在Kali系统编辑SSH配置文件并结合cpolar内网穿透软件,实现公网环境ssh远程连接本地kali系统。 1. 启…

科技云报道:大模型加持后,数字人“更像人”了吗?

科技云报道原创。 北京冬奥运AI 虚拟人手语主播、杭州亚运会数字人点火、新华社数字记者、数字航天员小诤…当随着越来越多数字人出现在人们生活中,整个数字人行业也朝着多元化且广泛的应用方向发展,快速拓展到不同行业、不同场景。 面向C端&#xff0…

appium

app元素抓取在线工具 Appium Inspector by Appium Pro appium安装(通过node.js安装) Python3Appium安装使用教程_python_脚本之家 Node version is 18.17.1

CST软件中变更求解器和宏的使用技巧【操作教程】

变更求解器 变更CST MWS中的Solver! Home > Simulation > Setup Solver CST Microwave Studio (CST MWS)总共有六个Solver。用户根据仿真目的和应用方向选择合适的Solver,才可以快速获得准确的结果。变更或选择Solver时,在Setup Sol…

DNS正反向解析

1.先连接X-shell 主服务器:192.168.32.168(server) 从服务器:192.168.32.169(node) 2.给主从服务器做准备工作 [rootserver ~]# setenforce 0 setenforce: SELinux is disabled [rootserver ~]# systemc…

盲盒App开发:探索未知惊喜,解锁潮流新玩法

在追求个性和独特体验的时代,盲盒文化以其独特的魅力,迅速占领了年轻人的心。为了满足这一市场需求,我们倾力打造了一款全新的盲盒App,带你开启一段充满未知与惊喜的探索之旅。 这款盲盒App融合了创新科技与潮流文化,…

Point-Nerf复现

Point-Nerf复现 0.0我自己的复现工程0.1相关库介绍0.1.1 pytorch0.1.2 h5py0.1.3 Scikit-Image0.1.4 imageio 0.2.复现简介0.3.参考链接 0.0我自己的复现工程 代码和安装包下载地址   所需库的安装包在package文件夹下,代码在code文件夹下,测试数据在…

FFmpeg: 简易ijkplayer播放器实现--05ijkplayer–连接UI界面和ffplay.c

文章目录 ijkplayer时序图消息循环--回调函数实现播放器播放时状态转换播放停止 ijkmediaPlay成员变量成员函数 ijkplayer时序图 stream_open: frame_queue_init packet_queue_init init_clock 创建read_thread线程 创建video_refresh_thread线程 消息循环–回调函数实现 ui …

003Node.js创建第一个web服务

如果用PHP来编写后端代码,需要用Apache或者Nginx的服务器,来处理客户的请求响应。对于Node.js时,不仅实现了应用,同时还实现了整个HTTP服务器. 安装 Node Snippets插件(编程自带提示) console.log(你好nodejs); //表…

PyCharm远程链接AutoDL

AutoDL使用方法: Step1:确认您安装的PyCharm是社区版还是专业版,只有专业版才支持远程开发功能。 Step2:开机实例 复制自己实例的SSH指令,比如:ssh -p 38076 rootregion-1.autodl.com 在ssh -p 38076 roo…

vue点击上传图片并实现图片预览功能,并实现多张图片放到一个数组中进行后端请求(使用原生input)

一、将 File 对象转成 BASE64 字符串 &#xff08;FileReader&#xff09; <template><div><!-- 用来显示封面的图片 --><!-- <img src"/assets/images/cover.jpg" alt"" class"cover-img" ref"imgRef" />…

创新实训2024.04.11日志:self-instruct生成指令

1. 参考文献 代码&#xff1a;https://github.com/yizhongw/self-instruct论文&#xff1a;https://arxiv.org/abs/2212.10560 2. 前沿论文阅读 2.1. self-instruct技术的优势 作者在文章中提到&#xff1a; The recent NLP literature has witnessed a tremendous amount …

python基础——python包【创建和导入,下载第三方包】

&#x1f4dd;前言&#xff1a; 在上一篇文章python基础——模块中&#xff0c;我们讲解了有关python模块的相关知识&#xff0c;这篇文章我们进一步讲解用于储存多个模块文件的python包&#xff1a; 1&#xff0c;什么是python包 2&#xff0c;如何创建和导入python包 3&#…

linux安装dubboAdmin

1.环境准备&#xff1a; jdk-8u391-linux-x64apache-maven-3.9.6apache-tomcat-8.5.100 2.安装注册中心zookeeper zookeeper的安装看我的另一篇文章&#xff0c;安装完成后保持启动状态 linux安装Zookeeper的详细步骤-CSDN博客 3.安装dubboadmin 源码下载地址&#xff1a;R…

Python学习从0开始——项目一day01爬虫(二)

Python学习从0开始——项目一day01爬虫&#xff08;二&#xff09; 一、解析response数据二、json转换三、文件保存四、存储json对象五、完整代码 上一篇 一、解析response数据 在已经知道我们获取图片的最终URL存在于请求响应response中&#xff0c;下一步的重点就放在解析re…