系列文章

RabbitMq系列(一):服务器搭建

RabbitMq系列(二):最简单的例子

RabbitMq系列(三):工作队列

RabbitMq系列(四):消息确认和持久性

RabbitMq系列(五):公平派遣

RabbitMq系列(六):交换类型以及例子

RabbitMq系列(七):直接交换Direct exchange

RabbitMq系列(八):扇出交换Fanout Exchange

RabbitMq系列(九):主题交换Topic Exchange

RabbitMq系列(十):标头交换Headers exchange

RabbitMq系列(十一):远程调用RPC

目录

前言

实际演示

示例1

示例2

总结


前言

主题交换是四个主要交换模式中,变化最多、最灵活的交换模式。主题交换的消息传递主要依赖于路由键,路由键不同,交换机匹配的方式不同。

主题交换的主要关注点在路由键,路由键通常是由零个或者多个有意义的单词通过点号( . )分隔拼接而成,类似于: topic.route.one ,topic.route,topic 等等,路由键最多只能有255个字节。

主题交换中一般的路由键规则跟直接交换路由规则大致相同,都是直接比较是否相等,但是主题交换有特殊的路由键规则。

主题交换中有个两个特殊的匹配符号:
 * : 匹配任意一个单词

# :匹配零个或者多个单词

不带两个特殊符号的路由键匹配规则的同直接交换匹配规则一样,带两个特殊符号的类似于模糊匹配,只带单个 # 的就是扇出交换啦,带特殊符号的路由键类似于: topic.#.#* , topic.route.#.# ,topic.route.*# , topic.route.one , # ,* 等等

实际演示

主题交换作为四个主要交换中最灵活的交换,路由键的定义非常丰富,所以这里采用三个消费者和一个生产者来进行测试,路由键从简单的复杂。

示例1

  • 环境
身份 交换机 队列 routeKey
消费者1 topic.exchange amq.gen-7V2hbBS1AIyJkSOSCuWdRA topic.route.two
消费者2 topic.exchange amq.gen-P4DJ32qk9nvX3UE7PM4T_A topic.route.*
消费者3 topic.exchange amq.gen-X_JrOM4KZP_KvMk3IcaH1g topic.#
生产者 topic.exchange topic.route.one
  • 消费者1
/*** 消费者1* @Tag 主题交换Topic exchange*/
public class MQConsumerOne {public static void main(String[] args) {try {consumerMsg("topic.exchange","topic.route.two");} catch (Exception e) {e.printStackTrace();}}public static void consumerMsg(String exchangeName,String routeKey) throws IOException, TimeoutException {//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置连接地址connectionFactory.setHost("10.0.10.3");//设置连接端口connectionFactory.setPort(5672);//设置连接的虚拟机connectionFactory.setVirtualHost("mqtest");//设置连接用户connectionFactory.setUsername("mqtest");//设置连接用户密码connectionFactory.setPassword("test123");//创建连接Connection connection = connectionFactory.newConnection();//创建通道Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC);//声明队列(临时排它队列)String queueName = channel.queueDeclare().getQueue();//绑定交换机channel.queueBind(queueName,exchangeName,routeKey);//消费消息(主动确认)channel.basicConsume(queueName,true,(tag,msg)->{System.out.println(new String(msg.getBody(),"UTF-8"));},(cancel)->{});/* //关闭连接channel.close();connection.close();*/}
}
  • 消费者2
/*** 消费者2* @Tag 主题交换Topic exchange*/
public class MQConsumerTwo {public static void main(String[] args) {try {consumerMsg("topic.exchange","topic.route.*");} catch (Exception e) {e.printStackTrace();}}public static void consumerMsg(String exchangeName,String routeKey) throws IOException, TimeoutException {//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置连接地址connectionFactory.setHost("10.0.10.3");//设置连接端口connectionFactory.setPort(5672);//设置连接的虚拟机connectionFactory.setVirtualHost("mqtest");//设置连接用户connectionFactory.setUsername("mqtest");//设置连接用户密码connectionFactory.setPassword("test123");//创建连接Connection connection = connectionFactory.newConnection();//创建通道Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC);//声明队列(临时排它队列)String queueName = channel.queueDeclare().getQueue();//绑定交换机channel.queueBind(queueName,exchangeName,routeKey);//消费消息(主动确认)channel.basicConsume(queueName,true,(tag,msg)->{System.out.println(new String(msg.getBody(),"UTF-8"));},(cancel)->{});/* //关闭连接channel.close();connection.close();*/}
}
  • 消费者3
/*** 消费者3* @Tag 主题交换Topic exchange*/
public class MQConsumerThree {public static void main(String[] args) {try {consumerMsg("topic.exchange","topic.#");} catch (Exception e) {e.printStackTrace();}}public static void consumerMsg(String exchangeName,String routeKey) throws IOException, TimeoutException {//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置连接地址connectionFactory.setHost("10.0.10.3");//设置连接端口connectionFactory.setPort(5672);//设置连接的虚拟机connectionFactory.setVirtualHost("mqtest");//设置连接用户connectionFactory.setUsername("mqtest");//设置连接用户密码connectionFactory.setPassword("test123");//创建连接Connection connection = connectionFactory.newConnection();//创建通道Channel channel = connection.createChannel();//声明交换机channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC);//声明队列(临时排它队列)String queueName = channel.queueDeclare().getQueue();//绑定交换机channel.queueBind(queueName,exchangeName,routeKey);//消费消息(主动确认)channel.basicConsume(queueName,true,(tag,msg)->{System.out.println(new String(msg.getBody(),"UTF-8"));},(cancel)->{});/* //关闭连接channel.close();connection.close();*/}
}
  • 唯一的生产者
/*** 生产者* @Tag 主题交换Topic exchange*/
public class MQProducer {public static void main(String[] args) {try {producerMsg("topic.exchange","topic.route.one","想要我的消息?就看你有没得这个本事!");} catch (Exception e) {e.printStackTrace();}}public static void producerMsg(String exchangeName,String routeKey,String msg) throws IOException, TimeoutException {//创建连接工厂ConnectionFactory connectionFactory = new ConnectionFactory();//设置连接地址connectionFactory.setHost("10.0.10.3");//设置连接端口connectionFactory.setPort(5672);//设置连接的虚拟机connectionFactory.setVirtualHost("mqtest");//设置连接用户connectionFactory.setUsername("mqtest");//设置连接用户密码connectionFactory.setPassword("test123");//创建连接Connection connection = connectionFactory.newConnection();//创建通道Channel channel = connection.createChannel();//声明临时交换机channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,false);//创建生产者channel.basicPublish(exchangeName,routeKey,null,msg.getBytes("UTF-8"));//关闭连接channel.close();connection.close();}
}
  • 完成代码逻辑过后,分别启动消费者1、消费者2、消费者3和唯一的生产者,观察消息的收发情况。这里消费者2、消费者3收到消息,消费者1未收到消息。

  • 分析一下:

1)  消费者1的 routeKey : topic.route.two

2)  消费者2的 routeKey : topic.route.*

3)消费者3的 routeKey : topic.#

4)唯一生产者的 routeKey : topic.route.one

咱们一个一个来,往下看

RabbitMq系列(九):主题交换Topic Exchange相关推荐

  1. RabbitMQ系列笔记主题订阅模式

    导语 昨天的内容主要讲了RabbitMQ的发布订阅模式和路由模式,都很好的满足了我们的日志打印,但是如果说,我对日志的打印,希望可以过滤掉一些内容呢,比如说,在打印错误日志的时候,只打印login时的 ...

  2. rabbitmq的通配符模式(Topic Exchange)的*和#区别

    符号"#"匹配路由键的一个或多个词,符号"*"匹配路由键的一个词. 例如: topic.#那么这个队列会会接收topic开头的消息 topic.*.queue那 ...

  3. RabbitMQ之主题(Topic)

    为什么80%的码农都做不了架构师?>>>    上一篇博客中,我们进一步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,而非fanout那 ...

  4. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  5. 【外行也能看懂的RabbitMQ系列(二)】—— RabbitMQ的Web管理界面(rabbitmq_management)详解(内含Topic模式通配符实操)

    系列文章目录 准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶 ...

  6. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  7. Exchange Server2013 系列九:常规配置

    Exchange Server2013 系列九:常规配置(一) 杜飞 经过前面的部署之后,我们的客户端访问角色和邮箱服务器角色都已经实现了高可用,但目前还不能正常使用,需要对服务器进行常规的配置,主要 ...

  8. RabbitMQ 主题(Topic)

    我们进步改良了我们的日志系统.我们使用direct类型转发器,使得接收者有能力进行选择性的接收日志,,而非fanout那样,只能够无脑的转发. 虽然使用direct类型改良了我们的系统,但是仍然存在一 ...

  9. Java笔记-使用RabbitMQ的Java接口实现topic(主题模式)

    目录 基本概念 代码与实例 基本概念 实现的就是官方给出的这个模型: Topic exchange:将路由和某模式匹配 其中 #:匹配一个或多个 *:匹配一个 比如下面要举得这个例子 交换机设置为to ...

最新文章

  1. 帮助子女养成良好的读书习惯 胜过1000亿财富
  2. linux设备模型,bus,device,driver,实验遇到的问题
  3. Spring依赖注入和控制反转
  4. 背包问题(nyoj106)
  5. 敏感词过滤算法:前缀树算法
  6. python压缩图片和视频
  7. PHP 框架集成使用 UEditor 编辑器的方法
  8. 绘画软件:krita for Mac
  9. PostgreSQL 函数
  10. matlab神经网络应用设计 张德丰,MATLAB神经网络应用设计
  11. SLAM Evaluation 之轨迹对齐论文翻译Closed-Form Solution of Absolute Orientation Using Orthonormal Matrices
  12. 猫猫回收站教程:在线撸猫~
  13. stm32f103c8t6的中文字库
  14. Java虚拟机知识点快速复习手册(上)
  15. 昂达b450s 内存超频3200,xmp设置教程
  16. nbs***bsp;是牛客的bug吗
  17. 关于google smtp邮件发送
  18. 当你人生迷失方向时候,请打开这个……
  19. 基于51单片机的超声波测距仪
  20. 高德地图API和百度地图API哪个更适合开发者?

热门文章

  1. linux系统中如何解压rar文件
  2. Java Sql语句中查询变量
  3. 平淡生活:喜羊羊和灰太郎获奖了
  4. python解包操作_python基础篇笔记02 文件操作 序列解包**星号语法
  5. 越来越多的人选择注册离岸公司这是为什么?
  6. 【面试题】JS面试大全
  7. 仅需10%参数量即超越SOTA!浙大、字节、港中文联合提出「类别级位姿估计」任务新框架|CoRL2022...
  8. pix2pix鼻祖——《Image-to-Image Translation with Conditional Adversarial Networks》论文解析
  9. [QCTF2018]picture
  10. 图片编辑软件 Google Picasa