RabbitMQ的交换机(原理及代码实现)

1.交换机类型

  • Fanout Exchange(扇形)
  • Direct Exchange(直连)
  • opic Exchange(主题)
  • Headers Exchange(头部)

2.Fanout Exchange

2.1 简介

Fanout 扇形的,散开的; 扇形交换机

投递到所有绑定的队列,不需要路由键,不需要进行路由键的匹配,相当于广播、群发;

如下图所示

P代表provider提供者,X代表exchange交换机,第三部分代表队列

2.2 代码示例

2.2.1 扇形交换机与队列

定义交换机主要由3部分组成,

  • 1.定义交换机
  • 2.定义队列
  • 3.绑定交换机
java 复制代码
@Configuration
public class RabbitConfig {
    //rabbitmq三部曲
    //1.定义交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("exchange.fanout");
    }
    //2.定义队列
    //此处定义两个队列
    @Bean
    public Queue queueA(){
        return new Queue("queue.fanout.a");
    }
    @Bean
    public Queue queueB(){
        return new Queue("queue.fanout.b");
    }
    //3.绑定交换机
    @Bean
    public Binding bindingA(FanoutExchange fanoutExchange,Queue queueA){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueA).to(fanoutExchange);
    }
    @Bean
    public Binding bindingB(FanoutExchange fanoutExchange,Queue queueB){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueB).to(fanoutExchange);
    }
}

2.2.2 模拟provider发送消息

发送消息模拟

java 复制代码
@Component
@Slf4j
public class MessageService {
    @Resource
    private RabbitTemplate rabbitTemplate;

    public void senMsg(){
        //定义消息
        String msg="hello world";
        //发消息
        Message message= new Message(msg.getBytes());
        rabbitTemplate.convertAndSend("exchange.fanout","",message);
        log.info("消息发送完毕,发送时间为:{}", new Date());
    }
}

2.2.3 接受扇形交换机信息

3.Direct Exchange

根据路由路由键(Routing Key)精确匹配(一模一样)进行路由消息队列;

与扇形交换机不同的是,直连交换机必须要绑定key

3.2代码示例

java 复制代码
@Configuration
public class RabbitConfig {
    //rabbitmq三部曲
    //1.定义交换机
    @Bean
    public DirectExchange directExchange(){
        return ExchangeBuilder.directExchange("exchange.direct").build();
    }
    //2.定义队列
    //此处定义两个队列
    @Bean
    public Queue queueA(){
        return new Queue("queue.direct.a");
    }
    @Bean
    public Queue queueB(){
        return new Queue("queue.direct.b");
    }
    //3.绑定交换机
    @Bean
    public Binding bindingA(DirectExchange directExchange,Queue queueA){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueA).to(directExchange).with("error");
    }
    @Bean
    public Binding bindingB1(DirectExchange directExchange,Queue queueB){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueB).to(directExchange).with("error");
    }
    @Bean
    public Binding bindingB2(DirectExchange directExchange,Queue queueB){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueB).to(directExchange).with("info");
    }
    @Bean
    public Binding bindingB3(DirectExchange directExchange,Queue queueB){
        //将队列A绑定到扇形交换机
        return BindingBuilder.bind(queueB).to(directExchange).with("warning");
    }
}

4. Topic Exchange

通配符匹配,相当于模糊匹配;

#匹配多个单词,用来表示任意数量(零个或多个)单词

*匹配一个单词(必须有一个,而且只有一个),用.隔开的为一个单词

5.Headers Exchange

基于消息内容中的headers属性进行匹配;

用的比较少

相关推荐
2501_9418227511 小时前
面向灰度发布与风险隔离的互联网系统演进策略与多语言工程实践分享方法论记录思考汇总稿件
android·java·人工智能
@小码农11 小时前
6547网:202512 GESP认证 C++编程 一级真题题库(附答案)
java·c++·算法
秋911 小时前
idea中使用AI编程助手Cursor详解
java·intellij-idea·ai编程
q行11 小时前
java学习日志--IO流(使用)
java·学习·io流
vyuvyucd11 小时前
Linux线程编程:POSIX与C++实战指南
java·开发语言
菜鸟233号11 小时前
力扣343 整数拆分 java实现
java·数据结构·算法·leetcode
毕设源码-朱学姐12 小时前
【开题答辩全过程】以 日程管理系统为例,包含答辩的问题和答案
java
a努力。12 小时前
京东Java面试被问:双亲委派模型被破坏的场景和原理
java·开发语言·后端·python·面试·linq
小毛驴85012 小时前
Maven同时配置阿里云仓库和私有仓库
java·阿里云·maven
刘975312 小时前
【第25天】25c#今日小结
java·开发语言·c#