一、简介

通过学习Dierect Exchange以及Topic Exchange,我们已经知道RabbitMQ无非就是创建相应的交换机、队列、以及将队列与交换机进行绑定,上面两种方式的交换机都需要指定相应的route key才能完成消息的分发。本章讲解的Fanout Exchange交换机其实是一种广播式的消息通信方式,只要某个队列与Fanout Exchange交换机进行了绑定,那么一条消息发送到交换机,这条消息就会被分发到所有进行绑定的消息接收者身上。无需指定route key,即使指定了route key路由键也会被忽略掉。可以借助下图来进行理解:

从上图总结几点:

【a】队列一、队列二都与Fanout Exchange交换机进行了绑定,所以当消息发送到交换机的时候,这些消息都会被分发到各个队列对应的消息接收者一和消息接收二上;同理,队列三没有绑定交换机,所以消息不会被分发到队列三上面。

【b】广播式消息消费方式,没有route key之说,不需要指定route key,即使指定了也会被忽略掉。所以我们一般传入空字符串“”就行。

【c】广播式消息分发,有助于我们对同一种消息进行分别处理。举个例子,加入当有会员注册的时候,我们通常需要赠送积分和保存会员信息等操作,这时候就可以构建一个保存会员队列与赠送积分队列,分别进行相应的逻辑处理。

二、准备工程

springboot_rabbitmq_fanout_exchange:端口1111

项目结构:

同样引入spring-boot-starter-amqp的依赖,具体pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.springboot.wsh</groupId><artifactId>springboot_rabbitmq_fanout_exchange</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>springboot_rabbitmq_fanout_exchange</name><description>RabbitMQ 广播模式</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

三、配置文件

server:port: 1111
spring:application:name: rabbit-fanout-exchangerabbitmq:host: localhostusername: guestpassword: guestport: 5672virtual-host: /publisher-confirms: true

四、新建Constants.java

主要存放一些交换机名称、队列名称等,方便后期维护。

/*** @Title: Constants* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: 常量类* @Author WeiShiHuai* @Date 2018/9/23 21:21*/
public class Constants {/*** 交换机名称*/public static final String FANOUT_EXCHANGE_NAME = "fanout.exchange.name";/*** 测试队列名称1*/public static final String TEST_QUEUE1_NAME = "test.queue1.name";/*** 测试队列名称1*/public static final String TEST_QUEUE2_NAME = "test.queue2.name";}

五、RabbitMQ Fanout Exchange配置

主要创建Fanout Exchange交换机实例、队列实例以及将队列绑定到交换机上。

/*** @Title: TestExchangeConfiguration* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: RabbitMQ Fanout Exchange配置类* @Author WeiShiHuai* @Date 2018/9/23 21:34* <p>* 说明:* 1. fanout路由又称为广播路由,会将收到的消息广播到消息对列上。当使用fanout交换器时,它会将消息广播到与该交换器绑定的所有队列上,有利于对单条消息做不同的反应。* 2. fanout路由无需指定route key,即使指定了也会被忽略,只要队列与交换机绑定,那么发送到交换机上的消息就会被分发到消息接收者上。*/
@Configuration
public class TestExchangeConfiguration {private static Logger logger = LoggerFactory.getLogger(TestExchangeConfiguration.class);/*** 创建广播形式的交换机** @return 交换机实例*/@Beanpublic FanoutExchange fanoutExchange() {logger.info("【【【交换机实例创建成功】】】");return new FanoutExchange(Constants.FANOUT_EXCHANGE_NAME);}/*** 测试队列一** @return 队列实例*/@Beanpublic Queue queue1() {logger.info("【【【测试队列一实例创建成功】】】");return new Queue(Constants.TEST_QUEUE1_NAME);}/*** 测试队列二** @return 队列实例*/@Beanpublic Queue queue2() {logger.info("【【【测试队列二实例创建成功】】】");return new Queue(Constants.TEST_QUEUE2_NAME);}/*** 绑定队列一到交换机** @return 绑定对象*/@Beanpublic Binding bingQueue1ToExchange() {logger.info("【【【绑定队列一到交换机成功】】】");return BindingBuilder.bind(queue1()).to(fanoutExchange());}/*** 绑定队列二到交换机** @return 绑定对象*/@Beanpublic Binding bingQueue2ToExchange() {logger.info("【【【绑定队列二到交换机成功】】】");return BindingBuilder.bind(queue2()).to(fanoutExchange());}}

六、新建消息发送者

注入RabbitTemplate,进行消息的分发

/*** @Title: TestSender* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: 消息发送者* @Author WeiShiHuai* @Date 2018/9/23 21:45*/
@Component
public class TestSender {private static Logger logger = LoggerFactory.getLogger(TestFanoutExchangeController.class);@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送消息** @param message 消息内容* 说明: routingKey可以指定也可以不指定,这里我们给一个空字符串""*/public void sendMessage(Object message) {logger.info("【消息发送者】发送消息到fanout交换机,消息内容为: {}", message);rabbitTemplate.convertAndSend(Constants.FANOUT_EXCHANGE_NAME, "", message);}}

七、新建消息接收者

分别创建两个消息接收者,使用@RabbitListener指定队列名称以及@RabbitHandler处理消息接收

/*** @Title: TestReceiver* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: 消息接收者* @Author WeiShiHuai* @Date 2018/9/23 21:55*/@Component
@RabbitListener(queues = "test.queue1.name")
public class TestReceiver {private static Logger logger = LoggerFactory.getLogger(TestReceiver.class);@RabbitHandlerpublic void receiveMessage(Object message) {logger.info("消息接收者接收到来自【队列一】的消息,消息内容: {}", message);}}
/*** @Title: TestReceiver2* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: 消息接收者2* @Author WeiShiHuai* @Date 2018/9/23 21:55*/@Component
@RabbitListener(queues = "test.queue2.name")
public class TestReceiver2 {private static Logger logger = LoggerFactory.getLogger(TestReceiver2.class);@RabbitHandlerpublic void receiveMessage(Object message) {logger.info("消息接收者接收到来自【队列二】的消息,消息内容: {}", message);}}

八、测试类

注入消息发送者,并且模拟发送了一串uuid,

/*** @Title: TestFanoutExchangeConstroller* @ProjectName springboot_rabbitmq_fanout_exchange* @Description: 测试Controller* @Author WeiShiHuai* @Date 2018/9/23 21:25*/
@RestController
public class TestFanoutExchangeController {@Autowiredprivate TestSender testSender;@GetMapping("/testFanoutExchange")public String testFanoutExchange() {//测试消息发送String message = UUID.randomUUID().toString();testSender.sendMessage(message);return "success";}}

九、启动项目

启动项目,如下图

可以看到,各个需要的实例都创建成功,访问http://localhost:1111/testFanoutExchange,

可以看到,消息接收者成功接收到了消息发送者发送的消息。

十、总结

至此,Fanout Exchange广播式交换机都已经实现完成,总体来说比Direct Exchange和Topic Exchange简单些,配置相对比较简单。总之,记住Fanout Exchange无需指定route key,只要和交换机进行绑定,那么消息就会被成功分发到消息接收者身上。本文是作者在学习Fanout Exchange的一些总结和使用经验,仅供大家参考,一起学习,共同进步!

SpringBoot整合RabbitMQ之Fanout Exchange扇形(广播式)交换机(学习总结)相关推荐

  1. Springboot整合RabbitMQ,包含direct,topic,fanout三种模式的整合

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  2. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ

    什么是RabbitMQ 1.1 MQ概述 MQ全称 Message Queue(消息队列),是在消息的传输过程中保存消息的容器.多用于分布式系统之间进行通信. ⚫ MQ,消息队列,存储消息的中间件 ⚫ ...

  3. 腻害,高人都是这样玩SpringBoot整合RabbitMQ

    一.认识 RabbitMQ RabbitMQ 简介以 AMQP 协议: (1)RabbitMQ 是开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ 底层是用了 ...

  4. SpringBoot 整合RabbitMq

    SpringBoot 整合RabbitMq (黑马讲义) SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便. SpringA ...

  5. Springboot 整合RabbitMq ,用心看完这一篇就够了

    该篇文章内容较多,包括有rabbitMq相关的一些简单理论介绍,provider消息推送实例,consumer消息消费实例,Direct.Topic.Fanout的使用,消息回调.手动确认等. (但是 ...

  6. Springboot整合一之Springboot整合RabbitMQ

    前言 目前,springboot已然成为了最热的java开发整合框架,主要是因其简单的配置,并且本身提供了很多与第三方框架的整合,甚至可以让我们在短短的几分钟里就可以搭建一个完整的项目架构.所以,博主 ...

  7. RabbitMQ原理及SpringBoot整合RabbitMQ

    RabbitMQ原理及SpringBoot整合RabbitMQ 1. RabbitMQ环境搭建 参考:https://blog.csdn.net/u013071014/article/details/ ...

  8. 九、springboot整合rabbitMQ

    springboot整合rabbitMQ 简介 rabbitMQ是部署最广泛的开源消息代理. rabbitMQ轻量级,易于在内部和云中部署. 它支持多种消息传递协议. RabbitMQ可以部署在分布式 ...

  9. SpringBoot整合 ActiveMQ、SpringBoot整合RabbitMQ、SpringBoot整合Kafka

    1.概念:SpringBoot 整合消息服务2.具体内容对于异步消息组件在实际的应用之中会有两类:· JMS:代表作就是 ActiveMQ,但是其性能不高,因为其是用 java 程序实现的:· AMQ ...

  10. RabbitMq(八) SpringBoot整合RabbitMQ 生产者代码实现

    在本章中我们将创建RabbitMQ的生产者工程,并实现生产者端代码实现. springboot整合RabbitMQ生产者工程步骤如下: 创建maven工程 引入springboot及RabbitMQ依 ...

最新文章

  1. 更新TensorFlow 2.0的旧代码
  2. c/c++ max/min 4种实现方法
  3. 解决Dynamic Web Module 3.0 Requires Java 1.6 or newer
  4. apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
  5. 【转】Linux面试题集锦
  6. 小科知道20211202
  7. IBM-JAVA面试题
  8. vim--之初学轻松几步走
  9. Axios的Vue插件(添加全局请求/响应拦截器)
  10. 函数局部变量和函数的参数在栈中的布局
  11. python怎么建立替换_Python-如何搜索和替换文件中的文本?
  12. springmvc重定向到另一个项目_springmvc怎么重定向,从一个controller跳到另外一个controller...
  13. Exchange 2010 无法删除第一个mailbox
  14. 打开英伟达控制面板超时打不开解决办法
  15. 怎么把ide改成ahci_怎么将IDE硬盘改为AHCI模式
  16. Ubuntu18.04 wifi不稳定
  17. 硬盘分区怎么不删除文件合并_硬盘分区怎么合并?
  18. 蓝牙耳机与电脑连接篇
  19. 2017年10米分辨率全球土地覆盖产品(FROM-GLC10)Python下载爬虫
  20. javascript-obfuscator 代码混淆

热门文章

  1. [PAT B1020] 月饼
  2. C/C++[1782 codeup] 谁是你的潜在朋友
  3. 计算机网络速度怎么改,如何更改网速到1000Mbps
  4. php定时器使用,PHP实现javascript的定时器
  5. C++的类型转换操作符
  6. 反射--获取构造器,获取父类,获取带泛型的父类,获取实现的接口,获取所在的包,获取注解
  7. bash给脚本加进度条_shell脚本进度条。
  8. 凸优化第四章凸优化问题 4.6广义不等式约束
  9. NLP系列(2)_用朴素贝叶斯进行文本分类(上)
  10. Linux环境下一种比较有用的多线程程序调试技巧