SpringBoot 消息队列RabbitMQ 交换机模式 Fanout广播 Direct定向 Topic话题

介绍

作用是接收生产者发送的消息,并根据某种规则将这些消息路由到一个或多个队列。交换机根据绑定规则和路由键来决定如何将消息分发到队列。简而言之,交换机是消息路由的核心组件,它负责将消息从生产者引导到适当的队列,以便消费者能够处理这些消息。


交换机类型

交换机分为3种类型。

  • Fanout广播 顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。
  • Direct定向 将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。
  • Topic话题 与 Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。
    -

Fanout广播

顾名思义将消息广播到交换机绑定的所有队列上,每个队列都可以接收到消息。

生产者

java 复制代码
    private  final RabbitTemplate rabbitTemplate;
   @GetMapping("/putRecord") 
    public Result userMessage(){
    
        rabbitTemplate.convertAndSend("amq.fanout",null,"我是发送者");
        //1.交换机  2.路由键   3.消息
        return  Result.success("操作成功",null);
    }

对于 fanout 类型的交换机,路由键会被忽略,因为 fanout 类型的交换机会将消息广播到所有绑定到它的队列。所以,在这种情况下,你可以将路由键设为 null 或者直接忽略这个参数。

消费者

java 复制代码
@Component
public class RecordQueues {
    @RabbitListener(queues ="play.queue")
    public  void  insertUserMessage(String msg){ //支付服务
        System.out.println("play.queue");
    }

    @RabbitListener(queues ="record.queue")
    public  void  recordUserMessage(String msg){ //记录服务
        System.out.println("record.queue");
    }
}
java 复制代码
play.queue
record.queue

两个消费者同时收到消息


Direct定向

将消息发生给不同的人,不同的服务接收不同的消息,会根据设置的规则发送给指定的队列,称为定向路由。

  • 每一个队列都与交换机设置一个绑定的键名Key
  • 消息发送着指定消息的路由键名Key
  • 一个队列可以绑定多个键名

这种模式更加的灵活

绑定路由器Key

在绑定队列的时候可以给改队列指定路由键名Key

一个队列可以绑定多个路由器Key

生产者

给路由键名为del的队列发送消息,也就是del.queue和delMsg.queue

java 复制代码
private  final RabbitTemplate rabbitTemplate;
@GetMapping("/putRecord") //插入记录
public Result userMessage(){
    rabbitTemplate.convertAndSend("amq.direct","del","我是发送者");
    return  Result.success("操作成功",null);
}

消费者

java 复制代码
@Component
public class RecordQueues {
    @RabbitListener(queues ="add.queue")
    public  void  a(String msg){ //支付服务
        System.out.println("add.queue");
    }
    
    @RabbitListener(queues ="del.queue")
    public  void  b(String msg){ //记录服务
        System.out.println("query.queue");
    }

    @RabbitListener(queues ="delMsg.queue")
    public  void  c(String msg){ //记录服务
        System.out.println("delMsg.queue");
    }

}
java 复制代码
delMsg.queue
query.queue

Topic话题

Direct定向不同的是他的routingKey可以是多个单词的列表以" . "分割。可以用他区分消息的类型或分组。

通过指定通配符绑定

  • #代指0个或多个单词
  • * 代指一个单词

例子

假如有以下routingKey(路由键名)

a.a123

a.a147

a.a369

b.b123

b.789

c.123

这个时候想给axx等发信息,可以使用Topic交换机指定a发信息,axx下的队列都会收到。

相关推荐
HalvmånEver8 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林9 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
dreamread9 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
把你毕设抢过来10 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端
闻哥10 小时前
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
java·数据库·spring boot·redis·spring·缓存·面试
毕设源码_廖学姐12 小时前
计算机毕业设计springboot古诗词学习App 基于SpringBoot的中华经典诗文数字化研习平台 SpringBoot框架下的传统诗词文化移动学习系统
spring boot·学习·课程设计
爱吃山竹的大肚肚14 小时前
RocketMQ 4.x + Spring Boot 生产级集成方案(完整笔记)
spring boot·rocketmq·java-rocketmq
毕设源码_严学姐15 小时前
计算机毕业设计springboot心理健康辅导系统 高校学生心灵关怀服务平台的设计与实现 校园智慧心理服务系统的设计与实现
spring boot·后端·课程设计
姗姗的鱼尾喵16 小时前
Java 面试内容分享
java·spring boot·面试
杰克尼16 小时前
苍穹外卖--day11
java·数据库·spring boot·mybatis·notepad++