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

相关推荐
杨荧14 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
计算机-秋大田2 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
代码之光_19803 小时前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
戴眼镜的猴4 小时前
Spring Boot的过滤器与拦截器的区别
spring boot
尘浮生5 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
尚学教辅学习资料5 小时前
基于SpringBoot的医药管理系统+LW示例参考
java·spring boot·后端·java毕业设计·医药管理
morris1316 小时前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
阿伟*rui9 小时前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
paopaokaka_luck11 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计