RabbitMQ消息模型之Routing-Topic

Routing Topic

Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符!这种模型Routingkey一般都是由一个或多个单词组成,多个单词之间以”.”分割,例如: item.insertitem.#item.*

image-20220526183808035

统配符

* (star) can substitute for exactly one word.    匹配不多不少恰好1个词
# (hash) can substitute for zero or more words.  匹配[0-n]个词a.#   可以匹配 a.b、a.b.c、a.b.c.d 等只要是a.开头的情况
a.*   只能匹配 a.b 这种后面只有一个单词的情况

通配符可以出现在

注意:RoutingKey的任意位置。

创建生产者

public class MyProducer {@Testpublic void test() throws Exception {// 交换机String exchange = "logs_topic";// 创建工厂ConnectionFactory factory = new ConnectionFactory();factory.setVirtualHost("/");factory.setHost("xuewei.world");factory.setUsername("xuewei");factory.setPassword("123456");factory.setPort(5672);// 创建连接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 声明交换机channel.exchangeDeclare(exchange, "topic");// 发布消息channel.basicPublish(exchange, "a.b", null, "a.b".getBytes());channel.basicPublish(exchange, "a.b.c", null, "a.b.c".getBytes());channel.basicPublish(exchange, "a.b.c.d", null, "a.b.c.d" .getBytes());channel.basicPublish(exchange, "a.b.c.d.e", null, "a.b.c.d.e".getBytes());}
}

创建消费者1

public class MyConsumer1 {public static void main(String[] args) throws Exception {// 指定交换机String exchange = "logs_topic";// 创建工厂ConnectionFactory factory = new ConnectionFactory();factory.setVirtualHost("/");factory.setHost("xuewei.world");factory.setUsername("xuewei");factory.setPassword("123456");factory.setPort(5672);// 创建连接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 绑定交换机channel.exchangeDeclare(exchange, "topic");// 创建临时队列String queue = channel.queueDeclare().getQueue();// 将临时队列绑定exchangechannel.queueBind(queue, exchange, "a.*");channel.queueBind(queue, exchange, "#.d.#");// 处理消息channel.basicConsume(queue, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消费者1: " + new String(body));// TODO 业务处理}});}
}

创建消费者2

public class MyConsumer2 {public static void main(String[] args) throws Exception {// 指定交换机String exchange = "logs_topic";// 创建工厂ConnectionFactory factory = new ConnectionFactory();factory.setVirtualHost("/");factory.setHost("xuewei.world");factory.setUsername("xuewei");factory.setPassword("123456");factory.setPort(5672);// 创建连接和通道Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 绑定交换机channel.exchangeDeclare(exchange, "topic");// 创建临时队列String queue = channel.queueDeclare().getQueue();// 将临时队列绑定exchangechannel.queueBind(queue, exchange, "#.b.#");// 处理消息channel.basicConsume(queue, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("消费者2: " + new String(body));// TODO 业务处理}});}
}

生产者生产的消息:a.ba.b.ca.b.c.da.b.c.d.e

消费者1接受的消息规则为:

channel.queueBind(queue, exchange, "a.*");
channel.queueBind(queue, exchange, "#.d.#");

所以消费者1将会接收到:a.ba.b.c.da.b.c.d.e

消费者2接受的消息规则为:

channel.queueBind(queue, exchange, "#.b.#");

所以消费者2将会接收到:a.ba.b.ca.b.c.da.b.c.d.e

image-20220526185946980

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/183307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESP32-Web-Server编程- WebSocket 编程

ESP32-Web-Server编程- WebSocket 编程 概述 在前述 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 中,我们创建了一个基于 HTTP 协议的 ESP32 Web 服务器,每当浏览器向 Web 服务器发送请求,我们将 HTML/CSS 文件提供给浏览器。 使用…

智能手表上的音频(四):语音通话

上篇讲了智能手表上音频文件播放。本篇开始讲语音通话。同音频播放一样有两种case:内置codec和BT。先看这两种case下audio data path,分别如下图: 内置codec下的语音通话audio data path 蓝牙下的语音通话audio data path 从上面两张图可以看…

享元模式 (Flyweight Pattern)

定义: 享元模式(Flyweight Pattern)是一种结构型设计模式,用于优化性能和内存使用。它通过共享尽可能多的相似对象来减少内存占用,特别是在有大量对象时。这种模式通常用于减少应用程序中对象的数量,并在多…

Redis 实战缓存

本篇概要: 1. 设置、查询、获取过期时间;2. 缓存穿透:设置空键;3. 封杀单ip;4. 封杀ip段;5. 缓存预热;6. 使用 hash 数据类型保存新闻的缓存,增加点击量;7. Sorted set&a…

纯js实现录屏并保存视频到本地的尝试

前言:先了解下:navigator.mediaDevices,mediaDevices 是 Navigator 只读属性,返回一个 MediaDevices 对象,该对象可提供对相机和麦克风等媒体输入设备的连接访问,也包括屏幕共享。 const media navigator…

【刷题】DFS

DFS 递归: 1.判断是否失败终止 2.判断是否成功终止,如果成功的,记录一个成果 3.遍历各种选择,在这部分可以进行剪枝 4.在每种情况下进行DFS,并进行回退。 199. 二叉树的右视图 给定一个二叉树的 根节点 root&#x…

深度学习之十二(图像翻译AI算法--UNIT(Unified Neural Translation))

概念 UNIT(Unified Neural Translation)是一种用于图像翻译的 AI 模型。它是一种基于生成对抗网络(GAN)的框架,用于将图像从一个域转换到另一个域。在图像翻译中,这意味着将一个风格或内容的图像转换为另一个风格或内容的图像,而不改变图像的内容或语义。 UNIT 的核心…

IDEA2022 Git 回滚及回滚内容恢复

IDEA2022 Git 回滚 ①选择要回滚的地方,右键选择 ②选择要回滚的模式 ③开始回滚 ④soft模式回滚的内容会保留在暂存区 ⑤输入git push -f ,然后重新提交,即可同步远程 注意观察IDEA右下角分支的标记,蓝色代表远程内容未同步到本…

数据结构 / day06 作业

1.下面的代码打印在屏幕上的值是多少? /下面的代码打印在屏幕上的值是多少?#include "stdio.h"int compute_data(int arr[], unsigned int len) {long long int result 0;if(result len)return arr[0];resultcompute_data(arr,--len);printf("len%d, res…

elementui中table进行表单验证

<el-form :model"ruleForm" ref"ruleForm" class"demo-ruleForm"><el-table :data"ruleForm.tableDataShou" border style"width: 100%;"><el-table-column type"index" label"序号" wi…

Android12源码分析

Android 12的源码结构与之前的版本类似&#xff0c;但也有一些新的变化和特性。以下是对Android 12源码结构的简要解析&#xff1a; 1. 系统源代码&#xff1a;这部分包含了整个Android操作系统的核心代码&#xff0c;包括Linux内核、系统库、运行时环境&#xff08;ART&#…

Flink源码解析零之重要名词的理解

名词解释 1)StreamGraph 根据用户通过 Stream API 编写的代码生成的最初的图。 (1)StreamNode 用来代表 operator 的类,并具有所有相关的属性,如并发度、入边和出边等。 (2)StreamEdge 表示连接两个StreamNode的边。 2)JobGraph StreamGraph经过优化后生成了 J…

【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能

文章目录 ⭐⭐⭐Spring核心源码分析自定义Spring框架⭐⭐⭐一、Spring使用回顾二、Spring核心功能结构1、Spring核心功能2、bean概述 三、Spring IOC相关接口分析1、BeanFactory解析2、BeanDefinition解析3、BeanDefinitionReader解析4、BeanDefinitionRegistry解析5、创建容器…

伪集群配置

编辑core-site 配置core-site 配置hdfs-site 将以下的文件配置进去 启动一下hadoop产生tmp文件 产生这个叫namenode的文件并格式化 回到~目录 再配置以下信息 配置以下信息 重启文件 再重新格式化配置namenode 再启动一下&#xff0c;然后jps看看&#xff0c;出现这样就…

java后端自学总结

自学总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的参数化和国际化。 S…

运维知识点-openResty

openResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——实现广告缓存测试企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRestynginxlua——OpenResty 企业级实战——畅购商城SpringCloud-网站首页高可用解决方案-openRes…

机器学习中参数优化或交叉验证评估指标含义

在Scikit-Learn中&#xff0c;cross_val_score函数支持多种不同的评分标准&#xff08;scoring参数&#xff09;。以下是一些常见的评分标准及其应用场景&#xff1a; 参考链接&#xff1a; https://blog.csdn.net/worther/article/details/126909270 https://zhuanlan.zhihu.c…

优化器原理——权重衰减(weight_decay)

优化器原理——权重衰减&#xff08;weight_decay&#xff09; weight_decay的作用 原理解析 实验观察 在深度学习中&#xff0c;优化器的 weight_decay 参数扮演着至关重要的角色。它主要用于实现正则化&#xff0c;以防止模型过拟合。过拟合是指模型在训练数据上表现优异&…

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷12

单选题 1、电子邮件地址中一定会出现的字符&#xff08;&#xff09; A、- B、 C、&#xff01; D、# 答案&#xff1a;B 2、以下常见的电脑硬件中&#xff0c;&#xff08;&#xff09;不是一种输入设备 A、鼠标 B、键盘 C、触摸板 D、显示器 答案&#xff1a;D 3、…

python | 简易版: pdf 转换为 word 方法

一、 前言 本文利用python将pdf转换为word方法&#xff0c;需要用到两个第三方模块&#xff0c;分别是&#xff1a; &#xff08;1&#xff09;pdfplumber&#xff0c;用来解析pdf文档&#xff0c;包括pdf的基本信息&#xff08;作者、创建时间、修改时间…&#xff09;及表格…