7.RabbitMQ系列之topic主题交换器
topic主题交换器它根据在队列绑定的路由键和路由模式通配符匹配将消息路由到队列。
生产者在消息头中添加路由键并将其发送到主题交换器。 收到消息后,exchange尝试将路由键与绑定到它的所有队列的绑定路由模式匹配。 如果找到匹配,则将消息路由到其路由模式匹配的队列,如果未找到匹配,则忽略该消息
Routing key: 它是单词列表,由句点 (.) 分隔,例如“asia.china.beijing”
Routing Pattern: 它是在绑定队列时指定的模式,它是单词和通配符的列表,如*和#,由句点 (.) 分隔。 通配符的使用如下:
*: 用于匹配路由键中特定位置的单词,例如“asia.china.*”的路由模式将匹配第一个单词是asia而第二个单词的路由键单词是china,例如asia.china.beijing和asia.china.nanjing。
# :- 用于匹配零个或多个单词,例如asia.china.#的路由模式将匹配以asia.china开头的路由键,例如“asia.china”和 “亚洲.中国.北京”。
1.完整代码示例
- 新增TopicExchangeConfig.java配置文件
 
@Configuration
public class TopicExchangeConfig {
    @Bean
    public TopicExchange topic() {
        return new TopicExchange("topic");
    }
    private static class ConsumerConfig {
        @Bean
        public Queue topicAutoDeleteQueue1() {
            return new AnonymousQueue();
        }
        @Bean
        public Queue topicAutoDeleteQueue2() {
            return new AnonymousQueue();
        }
        @Bean
        public Binding topicBinding1(TopicExchange topic, Queue topicAutoDeleteQueue1) {
            return BindingBuilder.bind(topicAutoDeleteQueue1).to(topic).with("asia.china.*");
        }
        @Bean
        public Binding topicBinding2(TopicExchange topic, Queue topicAutoDeleteQueue2) {
            return BindingBuilder.bind(topicAutoDeleteQueue2).to(topic).with("asia.china.#");
        }
    }
}
- 新增生产者
 
@Component
public class TopicSender {
    private RabbitTemplate rabbitTemplate;
    public TopicSender(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }
    public void send() {
        rabbitTemplate.convertAndSend("topic", "asia.china.beijing", "asia.china.beijing");
        rabbitTemplate.convertAndSend("topic", "asia.china.nanjing", "asia.china.nanjing");
        rabbitTemplate.convertAndSend("topic", "asia.china", "asia.china");
    }
}
- 消费者
 
@Component
public class TopicReceiver {
    @RabbitListener(queues = "#{topicAutoDeleteQueue1.name}")
    public void receive1(String in) {
        System.out.println("临时队列1接收到消息:" + in);
    }
    @RabbitListener(queues = "#{topicAutoDeleteQueue2.name}")
    public void receive2(String in) {
        System.out.println("临时队列2接收到消息:" + in);
    }
}
- 单元测试
 
@SpringBootTest
public class RabbitTest {
    @Autowired
    private TopicSender topicSender;
    @Test
    public void testTopicSender() {
        topicSender.send();
    }
}

可以看到对于#模式只有队列2接收到asia.china消息
7.RabbitMQ系列之topic主题交换器的更多相关文章
- RabbitMQ指南之五:主题交换器(Topic Exchange)
		
在上一章中,我们完善了我们的日志系统,用direct交换器替换了fanout交换器,使得我们可以有选择性地接收消息.尽管如此,仍然还有限制:不能基于多个标准进行路由.在我们的日志系统中,我们可能不仅希 ...
 - rabbitmq消息队列——"topic型交换器"
		
在之前的章节中我们改进了我们的日志系统,我们使用direct型交换器代替了只能盲目广播消息的fanout型交换器,这使得我们可以有选择性地接收日志. 尽管使用direct型交换器改进了我们的日志系统, ...
 - rabbitmq系列五 之主题交换机
		
1.主题 在前面的例子中,我们对日志系统进行了改进.使用了direct交换机代替了fanout交换机,从只能盲目的广播消息改进为有可能选择性的接收日志. 尽管直接交换机能够改善我们的日志系统,但是它也 ...
 - RabbitMQ系列教程之五:主题(Topic)(转载)
		
RabbitMQ系列教程之五:主题(Topic) (本实例都是使用的Net的客户端,使用C#编写),说明,中文方括号[]表示名词. 在上一个教程中,我们改进了我们的日志记录系统. 没有使用只能够进行虚 ...
 - RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
		
RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...
 - RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)
		
前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...
 - (八)RabbitMQ消息队列-通过Topic主题模式分发消息
		
原文:(八)RabbitMQ消息队列-通过Topic主题模式分发消息 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过 ...
 - RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe)(转载)
		
RabbitMQ系列教程之三:发布/订阅(Publish/Subscribe) (本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个 ...
 - Go RabbitMQ(五)主题
		
RabbitMQ topic 在之前我们将交换器的类型从fanout设置为direct后能够根据我们的选择获得响应的消息,虽然改良我们的消息日志系统,但是还有很多局限性,比如它不能基于多个标准进行路由 ...
 
随机推荐
- 一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群
			
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_185 2021年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像 ...
 - 关于javascript中this
			
------------恢复内容开始------------ 1 var number = 5; 2 var obj = { 3 number: 3, 4 fn1: (function () { 5 ...
 - 2019国家集训队论文《整点计数》命题报告  学习笔记/Min25
			
\(2019\)国家集训队论文<整点计数>命题报告 学习笔记/\(Min25\) 补了个大坑 看了看提交记录,发现\(hz\)的\(xdm\)早过了... 前置知识,\(HAOI\)< ...
 - Pinhole类声明和实现
			
针孔相机,带旋转,移动等功能. 类声明: #pragma once #ifndef __PINHOLE_HEADER__ #define __PINHOLE_HEADER__ #include &qu ...
 - 使用.NET简单实现一个Redis的高性能克隆版(四、五)
			
译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...
 - CF280D k-Maximum Subsequence Sum(线段树)
			
在做这题时我一开始把\(tag\)写入了结构体 #include <iostream> #include <cstdio> #include <cstring> # ...
 - io几乎没有,iowait却很高
			
遇到如下一种情况: top - 09:43:03 up 2 days, 22:48, 9 users, load average: 133.19, 132.60, 132.32 Tasks: 767 ...
 - RunCat 怎么白嫖付费图标?这篇文章告诉你!
			
RunCat 怎么白嫖付费图标?这篇文章告诉你! 什么是RunCat 为什么要破解RunCat 开始破解 所以可以看出第一个文件就是我们运行图标选项的数据,而stocks.json的就是图标商店的数据 ...
 - CF915G Coprime Arrays (莫比乌斯反演)
			
CF915G Coprime Arrays 题解 (看了好半天终于看懂了) 我们先对于每一个i想,那么 我们设 我们用莫比乌斯反演 有了这个式子,可比可以求出△ans呢?我们注意到,由于那个(i/d) ...
 - 踩坑,发现一个ShardingJdbc读写分离的BUG
			
ShardingJdbc 怎么处理写完数据立即读的情况的呢? 写在前面 我本地使用了两个库来做写库(ds_0_master)和读库(ds_0_salve),两个库并没有配置主从. 下面我就使用库里的 ...