首页 > 其他分享 >SpringBoot集成RabbitMQ的四种交换机(Direct、Topic、Fanout、Headers)

SpringBoot集成RabbitMQ的四种交换机(Direct、Topic、Fanout、Headers)

时间:2024-12-03 11:22:34浏览次数:10  
标签:return String Direct RabbitMQ Queue Bean message public SpringBoot

以下是四种 RabbitMQ 交换机类型(Direct、Topic、Fanout、Headers)的详细实例代码,展示如何分别实现并使用它们。


1. Direct Exchange(直连交换机)

Direct Exchange 将消息根据路由键(Routing Key)发送到指定的队列。

配置代码

@Configuration
public class DirectExchangeConfig {
​
    public static final String DIRECT_EXCHANGE = "direct_exchange";
    public static final String DIRECT_QUEUE = "direct_queue";
    public static final String DIRECT_ROUTING_KEY = "direct_key";
​
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(DIRECT_EXCHANGE);
    }
​
    @Bean
    public Queue directQueue() {
        return new Queue(DIRECT_QUEUE);
    }
​
    @Bean
    public Binding directBinding(Queue directQueue, DirectExchange directExchange) {
        return BindingBuilder.bind(directQueue).to(directExchange).with(DIRECT_ROUTING_KEY);
    }
}
发送消息
@Component
public class DirectMessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
​
    public void send(String message) {
        rabbitTemplate.convertAndSend("direct_exchange", "direct_key", message);
        System.out.println("Direct Message Sent: " + message);
    }
}

接收消息

@Component
public class DirectMessageConsumer {
    @RabbitListener(queues = "direct_queue")
    public void receive(String message) {
        System.out.println("Direct Message Received: " + message);
    }
}

2. Topic Exchange(主题交换机)

Topic Exchange 根据通配符匹配路由键发送消息。

配置代码

@Configuration
public class TopicExchangeConfig {
​
    public static final String TOPIC_EXCHANGE = "topic_exchange";
    public static final String TOPIC_QUEUE = "topic_queue";
    public static final String ROUTING_KEY_PATTERN = "topic.#";
​
    @Bean
    public TopicExchange topicExchange() {
        return new TopicExchange(TOPIC_EXCHANGE);
    }
​
    @Bean
    public Queue topicQueue() {
        return new Queue(TOPIC_QUEUE);
    }
​
    @Bean
    public Binding topicBinding(Queue topicQueue, TopicExchange topicExchange) {
        return BindingBuilder.bind(topicQueue).to(topicExchange).with(ROUTING_KEY_PATTERN);
    }
}

发送消息

@Component
public class TopicMessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
​
    public void send(String message, String routingKey) {
        rabbitTemplate.convertAndSend("topic_exchange", routingKey, message);
        System.out.println("Topic Message Sent: " + message + " with Routing Key: " + routingKey);
    }
}

接收消息

@Component
public class TopicMessageConsumer {
    @RabbitListener(queues = "topic_queue")
    public void receive(String message) {
        System.out.println("Topic Message Received: " + message);
    }
}

3. Fanout Exchange(广播交换机)

Fanout Exchange 将消息广播到所有绑定的队列,无需路由键。

配置代码

@Configuration
public class FanoutExchangeConfig {
​
    public static final String FANOUT_EXCHANGE = "fanout_exchange";
    public static final String FANOUT_QUEUE_1 = "fanout_queue_1";
    public static final String FANOUT_QUEUE_2 = "fanout_queue_2";
​
    @Bean
    public FanoutExchange fanoutExchange() {
        return new FanoutExchange(FANOUT_EXCHANGE);
    }
​
    @Bean
    public Queue fanoutQueue1() {
        return new Queue(FANOUT_QUEUE_1);
    }
​
    @Bean
    public Queue fanoutQueue2() {
        return new Queue(FANOUT_QUEUE_2);
    }
​
    @Bean
    public Binding fanoutBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueue1).to(fanoutExchange);
    }
​
    @Bean
    public Binding fanoutBinding2(Queue fanoutQueue2, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(fanoutQueue2).to(fanoutExchange);
    }
}

发送消息

@Component
public class FanoutMessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
​
    public void send(String message) {
        rabbitTemplate.convertAndSend("fanout_exchange", "", message);
        System.out.println("Fanout Message Sent: " + message);
    }
}

接收消息

@Component
public class FanoutMessageConsumer1 {
    @RabbitListener(queues = "fanout_queue_1")
    public void receive(String message) {
        System.out.println("Fanout Queue 1 Received: " + message);
    }
}
​
@Component
public class FanoutMessageConsumer2 {
    @RabbitListener(queues = "fanout_queue_2")
    public void receive(String message) {
        System.out.println("Fanout Queue 2 Received: " + message);
    }
}

4. Headers Exchange(头交换机)

Headers Exchange 根据消息头中的键值对匹配发送消息。

配置代码

@Configuration
public class HeadersExchangeConfig {
​
    public static final String HEADERS_EXCHANGE = "headers_exchange";
    public static final String HEADERS_QUEUE = "headers_queue";
​
    @Bean
    public HeadersExchange headersExchange() {
        return new HeadersExchange(HEADERS_EXCHANGE);
    }
​
    @Bean
    public Queue headersQueue() {
        return new Queue(HEADERS_QUEUE);
    }
​
    @Bean
    public Binding headersBinding(Queue headersQueue, HeadersExchange headersExchange) {
        return BindingBuilder.bind(headersQueue).to(headersExchange).where("header_key").matches("header_value");
    }
}

发送消息

@Component
public class HeadersMessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;
​
    public void send(String message) {
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setHeader("header_key", "header_value");
        Message amqpMessage = new Message(message.getBytes(), messageProperties);
        rabbitTemplate.convertAndSend("headers_exchange", "", amqpMessage);
        System.out.println("Headers Message Sent: " + message);
    }
}

接收消息

@Component
public class HeadersMessageConsumer {
    @RabbitListener(queues = "headers_queue")
    public void receive(String message) {
        System.out.println("Headers Message Received: " + message);
    }
}

总结

交换机类型匹配机制示例用途
Direct 精确匹配路由键(Routing Key)。 点对点通信
Topic 通配符匹配路由键(* 单词,# 多单词)。 广义主题订阅
Fanout 广播消息到所有绑定的队列,无需路由键。 广播通知
Headers 根据消息头的键值对匹配。 高级过滤逻辑

根据你的实际场景,可以选择适合的交换机类型并配置!

标签:return,String,Direct,RabbitMQ,Queue,Bean,message,public,SpringBoot
From: https://www.cnblogs.com/luorongxin/p/18583718

相关文章

  • Java:基于springboot的果蔬商城管理系统
    作者主页:IT小舟简介:Java领域优质创作者、Java项目、学习资料、技术互助文中获取源码项目介绍系统分为用户、管理员两个角色​主要适用于实体店的线上销售,打造线上线下一体化的销售模式,带动蔬菜的销售量,提高店铺的销售额。前台主要是登录注册、首页展示、分类搜索......
  • 基于SpringBoot实现的无人超市管理系统(代码+开题报告+答辩PPT+论文)
    ......
  • SpringBoot源码解析(六):打印Banner
    SpringBoot源码系列文章SpringBoot源码解析(一):SpringApplication构造方法SpringBoot源码解析(二):引导上下文DefaultBootstrapContextSpringBoot源码解析(三):启动开始阶段SpringBoot源码解析(四):解析应用参数argsSpringBoot源码解析(五):准备应用环境SpringBoot源码解......
  • SpringBoot 驱动下基于 MVC 的高校行政事务管理系统:设计蓝图与实现路径
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......
  • 基于 MVC 架构的 SpringBoot 高校办公室行政事务管理系统:创新设计与高效实现
    1绪论1.1课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得到提升,而读书就是人们获得精神享受非常重要的途径[1]。纸质版的书籍比较沉重,携带不方便,而由于手机......
  • springboot在线宠物用品交易网站的设计与实现(代码+数据库+LW)
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了在线宠物用品交易网站的开发全过程。通过分析在线宠物用品交易网站管理的不足,创建了一个计算机管理在线宠物用品交易网站的方案。文章介绍了在线宠物用品交易网站的系统分析......
  • springboot房屋租赁管理系统的设计与实现(代码+数据库+LW)
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对房屋租赁信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用房屋租赁管理系统可以有效管理,使......
  • Y20030035 基于微信小程序+Java+SpringBoot+vue+maven+mysql+的车位租赁管理系统设计
    车位租赁管理系统1.项目描概述2.开发的背景与意义3.功能结构4.界面展示5.源码获取1.项目描概述在移动互联网的迅速发展推进下,微信成了人们生活中不可缺少的一款信息交流和沟通平台。而微信小程序的推出,便得现在人们在日常生活中更多的是通过手机微信平台进行安装各......
  • springboot毕设病历管理系统程序+论文
    系统程序文件列表开题报告内容研究背景在当今快速发展的医疗行业中,病历管理作为医院日常运营的重要组成部分,其效率与准确性直接关系到医疗服务的质量和患者的满意度。随着患者数量的不断增加,传统的病历管理方式逐渐暴露出诸多不足,如信息检索困难、存储空间有限、数据安全难......
  • springboot毕设病历管理系统程序+论文
    系统程序文件列表开题报告内容研究背景在医疗领域,病历管理是一项至关重要的工作,它不仅关系到患者的个人健康信息,也直接影响到医疗服务的质量和效率。随着医疗信息化的发展,传统的纸质病历管理方式逐渐暴露出存储不便、检索效率低下、易丢失损坏等问题。特别是在大型综合医院......