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下的队列都会收到。

相关推荐
AskHarries2 小时前
Spring Boot集成Akka Cluster快速入门Demo
java·spring boot·后端·akka
2402_857589362 小时前
Java免税商品购物商城:Spring Boot实现详解
java·开发语言·spring boot
少喝冰美式2 小时前
【大模型教程】如何在Spring Boot中无缝集成LangChain4j,玩转AI大模型!
人工智能·spring boot·后端·langchain·llm·ai大模型·计算机技术
王彬泽3 小时前
【RabbitMQ】消息分发、事务
rabbitmq·事务·消息分发
罗政3 小时前
[附源码]SpringBoot+VUE+Java实现人脸识别系统
java·vue.js·spring boot
超级小的大杯柠檬水3 小时前
IDEA中实现springboot热部署
java·spring boot·intellij-idea
ABin-阿斌4 小时前
SpringBoot 整合 Easy_Trans 实现翻译的具体介绍
java·spring boot·后端
圆头圆脑圆JAVA4 小时前
简单了解微服务--黑马(在更)
java·spring boot·微服务
码农小伙4 小时前
SpringBoot中基于Mybatis-Plus多表联查(无xml,通过注解实现)
xml·spring boot·mybatis