RabbitMQ消息模型之Fanout消息模型

news2024/11/26 10:52:07

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);
    }
}
结果

在这里插入图片描述

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

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

相关文章

Java区域基层卫生云联his系统源码 医院信息管理系统源码

基于云计算的医疗卫生信息系统(cloud-based healthcare informationsystem,简称“云 HIS”)是基于云计算技术,将医院信息系统、电子病历系统、实验室信息系统、公共卫生等系统横向集成的系统,为医疗机构信息化建设提供标准化、信息化、协同化…

Java中的TCP通信

TCP通信 TCP通信Socket客户端ServerSocket服务端 例子:一发一收例子:多发多收异常捕获 例子:服务器与多个客户端同时通信多客户端通信架构服务端代码ServerReaderThread 服务端读数据线程 TCP通信 特点:面向连接、可靠通信 通信双…

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具,熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作,新手可借助可视化工具来进行过渡,命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

第七篇:3.6 其他评估考虑/4.审计指南/5. 通用报告规范/6.披露指南、参考标准及其他 - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象(AD Impression)第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 (Viewability)第四篇 …

Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展,用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录,并管理他们的登录状态。flask_login 提供了用户认证的基础结构,但具体的用户验证(如用户名和密码检查)和存储…

DAY03|203.移除链表元素、707.设计链表、206.反转链表

203.移除链表元素、707.设计链表、206.反转链表 LeetCode 203.移除链表元素LeetCode 707.设计链表LeetCode 206.反转链表双指针法递归法 LeetCode 203.移除链表元素 注意,在dummy上操作,返回也返回dummy->next 如果头铁想返回head,那样会…

Redis入门到通关之Redis介绍

文章目录 1.Redis简单介绍1.1 非关系型数据库介绍 2.本文介绍如下内容3.初始Redis3.1.认识NoSQL3.1.3.查询方式3.1.4.事务3.1.5.总结 3.2.认识Redis3.3 安装Redis 1.Redis简单介绍 Redis是一种键值型的 NoSql 数据库,这里有两个关键字: 键值型NoSql 其…

负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测; 2.单变量时间序列数据集,采用前12个时刻预测未来96个时刻的数据; 3.excel数据方便替换,运行…

C++算法 —— 回溯(二)

一、字母大小写全排列 1.链接 784. 字母大小写全排列 - 力扣(LeetCode) 2.描述 3.思路 首先,根据题意,这是一个不能重复的全排列,并且根据特定的规则,我们需要分三种情况,一种是当字符为数字…

Android源码解析之截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程。用过android系统手机的同学应该都知道,一般的android手机按下音量减少键和电源按键就会触发截屏事件(国内定制机做个修改的这里就不做考虑了)。那么这里的截屏事件是如何触发的呢…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开…

Linux进阶篇:linux操作系统一个神奇的分区:swap交换分区

linux操作系统一个神奇的分区:swap交换分区 1 Swap交换分区概念 Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就…

微信小程序 django+nodejs电影院票务售票选座系统324kd

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架:使用Vue.js开发跨平台应用的前端框架,编写一套代码,可编译到Android、小程序等平台。 前端:HTML5,CSS3 VUE 后端:java(springbootssm)/python(flaskdja…

网盘——显示在线用户

1、查看在线用户 客户端发送查看请求(只发送用户的名字),服务器将数据库中在线的用户查询出来并发送给客户端,客户端接收在线用户信息并作显示。 1.1、查看数据库的数据,在这里需要使用socket,所以我们在…

springboot相关报错解决

Caused by: java.lang.ClassNotFoundException: 目录 Caused by: java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener spring-boot-dependencies:jar:2.1.9.RELEASE was not found org.springframework.context.event.Generi…

界面设计【1】-项目的UI设计css

引言: 本篇博客对简单的css html界面设计做了简要介绍 这篇博客主要就是介绍了做横向项目中,CSS界面设计与优化。 界面设计【1】-项目的UI设计css 1. 什么是css?2. css编程demo3. 可视化效果 1. 什么是css? CSS是层叠样式表(Cascading S…

大型语言模型有什么用?

大型语言模型有什么用? 大型语言模型识别、总结、翻译、预测、生成文本和其他内容。 AI 应用程序正在总结文章、撰写故事和进行长时间对话——而大型语言模型正在承担繁重的工作。 大型语言模型或 LLM 是一种深度学习算法,可以根据从海量数据集中获得…

【PHP程序设计(高阶版)】——PHP操作MySQL教程

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

Linux C应用编程:MQTT物联网

1 MQTT通信协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传 输)是一种基于客户端-服务端架构的消息传输协议,如今,MQTT 成为了最受欢迎的物联网协议,已广泛应用于车联网、智能家居、即时聊…

TikTok怎么开通ads账户

一、TikTok的两种主流玩法 1、付费流量 蓝V认证TikTokAds(广告消耗达到3w美金可申请蓝V认证) 可以快速引流到独立站 2、免费流量 自己运营种草号、开直播 二、TikTok Ads如何开户? 开通广告账户 首先国内是无法自己申请TikTok Ads的&a…