RabbitMQ 主题模式即topic类型交换机
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类型交换机相关推荐
- RabbitMQ主题模式(Topic)
主题模式(Topic) 主体模式其实就是在路由模式的基础上,支持了对key的通配符匹配(星号以及井号),以满足更加复杂的消息分发场景. "#" : 匹配一个或者多个 "* ...
- RabbitMq 主题模式(Topic)
rabbitMq 主题模式介绍 主题模式可以简单的理解为可以动态路由,*代表一个单词,#可以代替零个或多个单词,单词最多 255 个字节,通过相关的匹配规则后就会将满足条件的消息放到对应的队列中,每个 ...
- RabbitMQ主题模式/RPC模式
主题模式 同样是在发布/订阅模式的基础上,根据主题匹配进行筛选是否接收消息,比第四类更灵活. P 表示为生产者. X 表示交换机.C1C2 表示为消费者,红色表示队列. exchange 模式从 fa ...
- RabbitMQ5. 主题模式(Topic)实现和原理步骤讲解,方式5
简单工作队类的实现配置步骤(5步) 引入AMQP的依赖 创建配置文件,链接消息队列(port name MQ账号密码 创建配置类,声明队列 使用消息生产者发送消息 使用消息消费者接受消息 1 . 引入 ...
- 3.RabbitMQ工作模式介绍
3.RabbitMQ工作模式介绍.md 文章目录 3.RabbitMQ工作模式介绍.md 1.简单模式 1.1总结 2.Work Queues 工作队列模式 2.1 模式说明 2.2 代码编写 2.3 ...
- RabbitMQ-topic主题模式
RabbitMQ-topic主题模式 Topic: 所有符合routingKey(此时可以是一个表达式)的routingKey所绑定的队列可以接收消息: 发送到topic类型交换机的消息的routin ...
- (需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试
背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:通配符模式,如果对R ...
- 消息中间件RabbitMQ-主题模式(Topic)
消息中间件RabbitMQ-主题模式(Topic) 主题模式(Topic) 什么是主题模式 创建队列与绑定 1)新建一个交换器 ,类型选择topic 2)点击新建的交换器topictest 3)添加匹 ...
- RabbitMQ学习系列(五):routing路由模式和Topic主题模式
(一)routing路由模式 在前面一篇博客中讲到了exchange的类型,其中direct类型的exchange就是用于routing路由模式.direct类型的交换机是指:交换机和队列绑定时会设置 ...
最新文章
- 摘自一个读者读后rework的感受
- DataGrid 或 DataView 中删除项时告知是否删除
- 再谈STM32的CAN过滤器-bxCAN的过滤器的4种工作模式以及使用方法总结
- 【机器学习】机器学习的学习经验总结!
- redis日志追加频率
- P4288 [SHOI2014]信号增幅仪 最小圆覆盖
- 小程序的服务器怎么与数据库连接,小程序怎么连接服务器数据库
- JQuery data API实现代码分析
- XAF 如何使用复合主键和复合外键
- Android ViewPager 重复数据问题的解决方法
- 一文带你浏览Graph Transformers
- Java网络编程入门(软件结构、网络通信协议、网络编程三要素)
- 猫眼网历史日票房数据爬取
- java递归获取树结构的指定层级、指定层级之上(向上递归(包含父集所有、爷爷集所有...)(父集单独、爷爷集单独...))、指定层级之下所有的(子集、孙子集...)和list集合转Tree树结构
- TCP和UDP各自的协议和端口号
- 【B端·BI系统实战分析】BI系统概述
- 有一种痛,叫 “今年没有年终奖”!!!
- 2008北京九华山庄itpub年会有感
- ASR6500S低功耗LoRa+射频前端LPWAN应用芯片
- iphone6 续航 测试软件,7款iPhone测试iOS13.6电池续航:结果耗电更严重了?