SpringBoot整合RabbitMQ中交换机的使用(完成消息的发送和接收案例)

系列文章目录

1.SpringBoot整合RabbitMQ并实现消息发送与接收
2. 解析JSON格式参数 & 修改对象的key
3. VUE整合Echarts实现简单的数据可视化
4. List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
5. 使用AOP切面实现日志记录功能



前言

注:在学习交换机前,先要学习SpringBoot整合RabbitMQ的步骤和队列间的消息发送和接收:
因为以前写过《SpringBoot整合RabbitMQ并实现消息发送与接收》的文章,所以这篇文章设计到上篇文章的内容不会再进行讲解。如果有什么代码看不懂,请先查看上一篇文章:SpringBoot整合RabbitMQ并实现消息发送与接收 这篇文章重点讲述交换机的使用,理解交换机的作用和为什么要使用交换机。使大家能够在业务场合上去熟练的使用交换机实现不同的业务。


一、交换机定义以及作用

在RabbitMQ中,交换机(Exchange)是消息传递的核心组件之一。它负责接收来自生产者的消息,并将其路由到一个或多个称为队列(Queue)的目标。可以把交换机看做是一个邮局,生产者将消息投递到邮局中,交换机会根据消息的路由键将消息分发到不同的邮箱中

交换机根据规则将收到的消息分发给绑定到它上面的队列。这些规则可以通过指定交换机类型和绑定键(Binding Key)来定义。RabbitMQ提供了几种不同类型的交换机:

  1. 直接交换机Direct Exchange):它将消息路由到与绑定键完全匹配的队列。
  2. 主题交换机Topic Exchange):它根据绑定键和通配符的匹配规则将消息路由到一个或多个队列。
  3. 扇形交换机Fanout Exchange):它将消息广播到所有绑定到它上面的队列,忽略绑定键。
  4. 头部交换机Headers Exchange):它根据消息的头部属性进行匹配,将消息路由到与头部属性匹配的队列。

交换机的选择取决于消息的路由需求和业务场景。通过合理配置交换机和队列的绑定关系,可以实现灵活的消息路由和分发机制。

二、为什么使用交换机

使用交换机的主要目的是实现消息的路由(Routing)和分发(Distribution),以及实现解耦和灵活性。以下是一些使用交换机的重要原因:

  1. 灵活的消息路由:通过使用交换机,可以根据消息的路由键将消息发送到指定的队列中。这样可以实现不同类型的消息分发到不同的消费者,从而实现对消息的灵活控制。
  2. 解耦生产者和消费者:交换机可以实现解耦,即生产者不需要知道消息将被发送到哪个具体的队列,只需要将消息发送到指定的交换机即可,交换机会负责将消息路由到相应的队列中。
  3. 消息过滤和按需消费:通过合理配置交换机和队列的绑定关系,可以实现消息的过滤和按需消费,确保消息只被相关的消费者接收。
  4. 消息广播和订阅:某些类型的交换机(如Fanout Exchange)可以将消息广播到所有与之绑定的队列中,实现消息的订阅和广播功能。
  5. 支持多种消息分发策略:不同类型的交换机支持不同的消息分发策略,如直接匹配、通配符匹配等,从而满足不同场景下的消息路由需求。

总之,使用交换机可以提高消息系统的灵活性、可靠性和可维护性,使得消息的生产、路由和消费能够更加高效和灵活。

三、创建交换机

在理解了交换机的作用后,我们通过代码去使用交换机实现消息的发送与接收。这里我的案例使用最常用的**直接交换机(Direct Exchange)**实现消息的发送和接收。

3.1 创建交换机和队列

下述代码中,创建交换机完成后,需要将队列绑定到交换机上,这里的.with("info")routingKey,因为将消息给到交换机后,一个交换机可以绑定多个队列,但将消息发送到哪个队列,就需要routingKey去判断发送到哪个队列。

/**
 * 配置:
 * 创建交换机、创建队列、将队列绑定到交换机上
 */
@Configuration
public class RabbitMQConfig {

    // 创建交换机
    @Bean
    public DirectExchange directExchange() {
        System.err.println("心态~ 创建交换机:xintai_exchange");
        return new DirectExchange("xintai_exchange");
    }

    // 创建队列
    @Bean
    public Queue myQueue() {
        System.err.println("心态~ 创建队列:my_queue1");
        return new Queue("my_queue1");
    }

    // 将队列绑定到交换机上
    @Bean
    public Binding binding(Queue myQueue, DirectExchange directExchange) {
        System.err.println("心态~ 将队列绑定到交换机上");
        return BindingBuilder.bind(myQueue).to(directExchange).with("info");
    }

}

3.2 创建接收者

@RabbitListener用来监听上述创建的队列my_queue1的消息。

/**
 * 接收消息
 */
@Component
public class Consumer {

    @RabbitListener(queues = "my_queue1")
    public void receiveMessage(String message) {
        System.out.println("心态~ my_queue1队列接收到消息:" + message);
    }
}

3.3 编写访问接口发送消息

下述代码中,rabbitTemplate.convertAndSend是rabbitmq用来发送消息的方法。其中第一个参数是交换机的名称(创建时的名称),第二个参数是routingKey,这里也是在上述代码中创建的,第三个参数就是需要发送的消息内容。

@RestController
@RequestMapping("/messages1")
public class MessageController1 {

//    @Autowired
//    private Producer producer;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/send1")
    public String sendMessage(@RequestParam String message) {
        System.err.println("心态~ 进入Controller层,接收到消息message ="+message);

        System.err.println("心态~ convertAndSend 转换并发送xintai_exchange交换机,routingKey为info");
        rabbitTemplate.convertAndSend("xintai_exchange", "info", message);
        return "消息发送成功!";
    }

}

四、效果图

4.1 postman调用接口

代码就编写完了,启动项目,启动rabbitmq。在postman中调用接口去发送消息。如下图所示:
在这里插入图片描述

4.2 控制台打印

发送完消息后,查看控制台打印效果,可得看到以成功接收到消息。如下图所示:
在这里插入图片描述

4.3 RabbitMq平台查看

登录http://localhost:15672,点击exchanges,可看到代码创建的交换机。如下图所示:
在这里插入图片描述
点击xintai_exchange交换机,会看到这个交换机里队列详情信息。如下图所示:
在这里插入图片描述


总结

这边就实现了交换机的使用,看到这里您也一定实现了这个发送消息的操作吧。但您一定会想到,如果一个交换机有多个队列,那怎么配置呢?怎么去实现只将消息发送到一个交换机里的一个队列呢?这就是routingKey配置和在RabbitMQConfig直接创建队列进行绑定就行。原理一样,大家多多思考练习~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心态还需努力呀

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值