1.概述

类型是topic交换机的消息的routing key 不能随意写,必须满足一定的要求,它必须是一个单词列表,以点号分隔开,星号(*)可以代替一个单词,井号(#)可以代替零个或多个单词

2.举例

Q1绑定的是:中间带orange带3个单词的字符串

Q2绑定的是:最后一个单词是rabbit的3个单词的字符串;第一个单词是lazy的多个单词

  • quick.orange.rabbit 被Q1Q2接收
  • lazy.orange.elephant 被Q1和Q2接收
  • quick.orange.fox被Q1接收
  • lazy.brown.fox被Q2接收
  • lazy.pink.rabbit 被Q2接收
  • quick.brown.fox不被任何队列接收
  • lazy.orange.male.rabbit 被Q2接收

3.代码实现

(1)生产者

package com.rabbitmq.seven;import com.rabbitmq.client.Channel;
import com.rabbitmq.utils.MqUtils;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;/*** 生产者*/
public class EmitLogTopic {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws IOException, TimeoutException {Channel channel = MqUtils.getChannel();HashMap<String, String> bindingKeyMap = new HashMap<>();bindingKeyMap.put("quick.orange.rabbit", "被队列 Q1Q2 接收到");bindingKeyMap.put("lazy.orange.elephant", "被队列 Q1Q2 接收到");bindingKeyMap.put("quick.orange.fox", "被队列 Q1 接收到");bindingKeyMap.put("lazy.brown.fox", "被队列 Q2 接收到");bindingKeyMap.put("azy.pink.rabbit", "虽然满足两个绑定但只被队列 Q2 接收一次");bindingKeyMap.put("quick.brown.fox", "不匹配任何绑定不会被任何队列接收到会被丢弃");bindingKeyMap.put("quick.orange.male.rabbit", "是四个单词不匹配任何绑定会被丢弃");bindingKeyMap.put("lazy.orange.male.rabbit", "是四个单词但匹配 Q2");for (Map.Entry<String, String> bindingKeyEntry : bindingKeyMap.entrySet()) {String routingKey = bindingKeyEntry.getKey();String message = bindingKeyEntry.getValue();channel.basicPublish(EXCHANGE_NAME, routingKey, null , message.getBytes("UTF-8"));System.out.println("生产者发出消息:" + message + "routingKey:" + routingKey);}}
}

(2) 消费者1

package com.rabbitmq.seven;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.utils.MqUtils;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** 消费者C1-主题交换机*/
public class ReceiveTopic01 {// 声明交换机private static final String EXCHANGE_NAME = "topic_logs";// 接收消息public static void main(String[] args) throws IOException, TimeoutException {Channel channel = MqUtils.getChannel();// 声明交换机channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 声明队列String queueName = "Q1";channel.queueDeclare(queueName, false, false, false, null);// 队列交换机绑定/*** 参数说明* 1.队列名* 2.交换机名* 3.RoutingKey*/channel.queueBind(queueName, EXCHANGE_NAME,"*.orange.*");System.out.println("等待接收消息");// 接收消息DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println(new String(message.getBody(),"UTF-8"));System.out.println("接收队列" + queueName + "绑定键" + message.getEnvelope().getRoutingKey());};channel.basicConsume(queueName, true, deliverCallback, consumerTag->{});}
}

 (3)消费者2

package com.rabbitmq.seven;import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.utils.MqUtils;import java.io.IOException;
import java.util.concurrent.TimeoutException;/*** 消费者C2-主题交换机*/
public class ReceiveTopic02 {// 声明交换机private static final String EXCHANGE_NAME = "topic_logs";// 接收消息public static void main(String[] args) throws IOException, TimeoutException {Channel channel = MqUtils.getChannel();// 声明交换机channel.exchangeDeclare(EXCHANGE_NAME, "topic");// 声明队列String queueName = "Q2";channel.queueDeclare(queueName, false, false, false, null);// 队列交换机绑定/*** 参数说明* 1.队列名* 2.交换机名* 3.RoutingKey*/channel.queueBind(queueName, EXCHANGE_NAME,"*.*.rabbit");channel.queueBind(queueName, EXCHANGE_NAME,"lazy.#");System.out.println("等待接收消息");// 接收消息DeliverCallback deliverCallback = (consumerTag, message) -> {System.out.println(new String(message.getBody(),"UTF-8"));System.out.println("接收队列" + queueName + "绑定键" + message.getEnvelope().getRoutingKey());};channel.basicConsume(queueName, true, deliverCallback, consumerTag->{});}
}

4.执行效果

RabbitMQ 主题模式即topic类型交换机相关推荐

  1. RabbitMQ主题模式(Topic)

    主题模式(Topic) 主体模式其实就是在路由模式的基础上,支持了对key的通配符匹配(星号以及井号),以满足更加复杂的消息分发场景. "#" : 匹配一个或者多个 "* ...

  2. RabbitMq 主题模式(Topic)

    rabbitMq 主题模式介绍 主题模式可以简单的理解为可以动态路由,*代表一个单词,#可以代替零个或多个单词,单词最多 255 个字节,通过相关的匹配规则后就会将满足条件的消息放到对应的队列中,每个 ...

  3. RabbitMQ主题模式/RPC模式

    主题模式 同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息,比第四类更灵活. P 表示为生产者. X 表示交换机.C1C2 表示为消费者,红色表示队列. exchange 模式从 fa ...

  4. RabbitMQ5. 主题模式(Topic)实现和原理步骤讲解,方式5

    简单工作队类的实现配置步骤(5步) 引入AMQP的依赖 创建配置文件,链接消息队列(port name MQ账号密码 创建配置类,声明队列 使用消息生产者发送消息 使用消息消费者接受消息 1 . 引入 ...

  5. 3.RabbitMQ工作模式介绍

    3.RabbitMQ工作模式介绍.md 文章目录 3.RabbitMQ工作模式介绍.md 1.简单模式 1.1总结 2.Work Queues 工作队列模式 2.1 模式说明 2.2 代码编写 2.3 ...

  6. RabbitMQ-topic主题模式

    RabbitMQ-topic主题模式 Topic: 所有符合routingKey(此时可以是一个表达式)的routingKey所绑定的队列可以接收消息: 发送到topic类型交换机的消息的routin ...

  7. (需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试

    背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:通配符模式,如果对R ...

  8. 消息中间件RabbitMQ-主题模式(Topic)

    消息中间件RabbitMQ-主题模式(Topic) 主题模式(Topic) 什么是主题模式 创建队列与绑定 1)新建一个交换器 ,类型选择topic 2)点击新建的交换器topictest 3)添加匹 ...

  9. RabbitMQ学习系列(五):routing路由模式和Topic主题模式

    (一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...

最新文章

  1. 摘自一个读者读后rework的感受
  2. DataGrid 或 DataView 中删除项时告知是否删除
  3. 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
  4. 【机器学习】机器学习的学习经验总结!
  5. redis日志追加频率
  6. P4288 [SHOI2014]信号增幅仪 最小圆覆盖
  7. 小程序的服务器怎么与数据库连接,小程序怎么连接服务器数据库
  8. JQuery data API实现代码分析
  9. XAF 如何使用复合主键和复合外键
  10. Android ViewPager 重复数据问题的解决方法
  11. 一文带你浏览Graph Transformers
  12. Java网络编程入门(软件结构、网络通信协议、网络编程三要素)
  13. 猫眼网历史日票房数据爬取
  14. java递归获取树结构的指定层级、指定层级之上(向上递归(包含父集所有、爷爷集所有...)(父集单独、爷爷集单独...))、指定层级之下所有的(子集、孙子集...)和list集合转Tree树结构
  15. TCP和UDP各自的协议和端口号
  16. 【B端·BI系统实战分析】BI系统概述
  17. 有一种痛,叫 “今年没有年终奖”!!!
  18. 2008北京九华山庄itpub年会有感
  19. ASR6500S低功耗LoRa+射频前端LPWAN应用芯片
  20. iphone6 续航 测试软件,7款iPhone测试iOS13.6电池续航:结果耗电更严重了?

热门文章

  1. Web安全测试之跨站请求伪造(CSRF)篇
  2. 08服务器修改远程端口,服务器修改远程端口
  3. c专家编程3、4章读书笔记
  4. 什么是农业信息化系统
  5. python中import random可以省略吗_import random函数 python中random什么意思
  6. Tensorflow2 图像分类-Flowers数据深度学习模型保存、读取、参数查看和图像预测
  7. 各种软件破解/安装网址及说明
  8. linux进程同步互斥实验小结,操作系统进程同步互斥实验
  9. DHCP和PPPoE协议以及抓包分析
  10. 英语交流加我微信号Williamwhc