rabbitmq-通配符模式
【README】
本文介绍 通配符模式,及代码示例
【1】intro to rabbitmq通配符模式
0)通配符模式-交换机类型为 Topic;
1)与路由模式相比,相同点是 两者都可以通过 routingkey 把消息转发到不同的队列;
不同点是通配符模式-topic类型的exchange可以让队列在绑定routing key的时候使用通配符;
2)通配符模式的routingkey 通常使用多个单词并用点号连接,如 item.insert ;
3)通配符规则:
# 匹配一个或多个词;
* 匹配不多不少一个词;
荔枝:
item.# 能够匹配 item.insert.abc 或 item.insert ; (可以多层)
item.* 能够匹配 item.insert ; (只能一层)
refers2 https://www.rabbitmq.com/tutorials/tutorial-five-java.html
4)新建队列
5)把队列绑定到交换机
6)生产者发送消息到队列,路由key 分别是 item.insert , item.update, item.delete ; 如下:
【2】代码
生产者
/*** 通配符模式-交换机类型为TOPIC*/
public class WildProducer {/* 交换机名称 */static final String TOPIC_EXCHANGE = "topic_exchange"; /*队列名称1*/ static final String TOPIC_QUEUE_1 = "topic_queue_1";/*队列名称2*/static final String TOPIC_QUEUE_2 = "topic_queue_2";public static void main(String[] args) throws Exception {/*获取连接*/Connection conn = RBConnectionUtil.getConn();// 创建频道 Channel channel = conn.createChannel();/*** 声明交换机* 参数1-交换机名称 * 参数2-交换机类型(fanout, topic, direct, headers)*/channel.exchangeDeclare(TOPIC_EXCHANGE, BuiltinExchangeType.TOPIC); /*** routingkey-路由键 */String itemInsertRoutingKey = "item.insert"; String itemUpdateRoutingKey = "item.update";String itemDeleteRoutingKey = "item.delete";/* 发送消息-insert */ /*** 参数1 交换机名称 如果没有指定则使用默认 default exchange * 参数2 routingkey-路由key, 简单模式可以传递队列名称 * 参数3 消息其他属性* 参数4 消息内容 */String insertMsg = "我是消息,通配符模式,routingkey=" + itemInsertRoutingKey + MyDateUtil.getNow();channel.basicPublish(TOPIC_EXCHANGE, itemInsertRoutingKey, null, insertMsg.getBytes());System.out.println("已发送消息=" + insertMsg); String updMsg = "我是消息,通配符模式,routingkey=" + itemUpdateRoutingKey + MyDateUtil.getNow();channel.basicPublish(TOPIC_EXCHANGE, itemUpdateRoutingKey, null, updMsg.getBytes());System.out.println("已发送消息=" + updMsg);String deleteMsg = "我是消息,通配符模式,routingkey=" + itemDeleteRoutingKey + MyDateUtil.getNow();channel.basicPublish(TOPIC_EXCHANGE, itemDeleteRoutingKey, null, deleteMsg.getBytes());System.out.println("已发送消息=" + deleteMsg);/* 关闭连接和信道 */ channel.close();conn.close(); }
}
消费者1 topic_queue_1
/*** 通配符模式消费者-routingkey */
public class RouteConsumerWild1 {/* 交换机名称 */static final String TOPIC_EXCHANGE = "topic_exchange"; /*队列名称1*/ static final String TOPIC_QUEUE_1 = "topic_queue_1";public static void main(String[] args) throws Exception {/*创建连接 */Connection conn = RBConnectionUtil.getConn();/*创建队列*/Channel channel = conn.createChannel(); /*声明交换机*/channel.exchangeDeclare(TOPIC_EXCHANGE, BuiltinExchangeType.TOPIC);/*** routingkey-路由键 */String itemInsertRoutingKey = "item.insert"; String itemUpdateRoutingKey = "item.update";String itemDeleteRoutingKey = "item.delete";/*** 声明/创建队列 * 参数1 队列名称 * 参数2 是否持久化* 参数3 是否独占本连接 * 参数4 是否在不使用的时候自动删除队列* 参数5 队列其他参数 */
// channel.queueDeclare(TOPIC_QUEUE_1, true, false, false, null); // ui界面可以创建队列 /*** 队列绑定交换机* 参数1 队列名称* 参数2 交换机* 参数3 routingkey-路由键 */
// channel.queueBind(TOPIC_QUEUE_1, TOPIC_EXCHANGE, "item.#"); // ui界面可以把队列绑定到交换机 /* 创建消费者,设置消息处理逻辑 */Consumer consumer = new DefaultConsumer(channel) {/*** @param consumerTag 消费者标签,在 channel.basicConsume 可以指定 * @param envelope 消息包内容,包括消息id,消息routingkey,交换机,消息和重转标记(收到消息失败后是否需要重新发送) * @param properties 基本属性* @param body 消息字节数组 */@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,BasicProperties properties, byte[] body) throws IOException {System.out.println("=== 消费者1 start ===");System.out.println("路由key=" + envelope.getRoutingKey());System.out.println("交换机=" + envelope.getExchange());System.out.println("消息id=" + envelope.getDeliveryTag()); String message = new String(body, "UTF-8");System.out.println(String.format("消费者收到的消息【%s】", message)); System.out.println("=== 消费者1 end ===\n"); } };/*** 监听消息 * 参数1 队列名称 * 参数2 是否自动确认, 设置为true表示消息接收到自动向 mq回复ack;mq收到ack后会删除消息; 设置为false则需要手动发送ack; * 参数3 消息接收后的回调 */channel.basicConsume(TOPIC_QUEUE_1, true, consumer); }
}
消费者2 topic_queue_2
/*** 通配符模式消费者-routingkey */
public class RouteConsumerWild2 {/* 交换机名称 */static final String TOPIC_EXCHANGE = "topic_exchange"; /*队列名称1*/ static final String TOPIC_QUEUE_2 = "topic_queue_2";public static void main(String[] args) throws Exception {/*创建连接 */Connection conn = RBConnectionUtil.getConn();/*创建队列*/Channel channel = conn.createChannel(); /*声明交换机*/channel.exchangeDeclare(TOPIC_EXCHANGE, BuiltinExchangeType.TOPIC);/*** routingkey-路由键 */String itemInsertRoutingKey = "item.insert"; String itemUpdateRoutingKey = "item.update";String itemDeleteRoutingKey = "item.delete";/*** 声明/创建队列 * 参数1 队列名称 * 参数2 是否持久化* 参数3 是否独占本连接 * 参数4 是否在不使用的时候自动删除队列* 参数5 队列其他参数 */
// channel.queueDeclare(TOPIC_QUEUE_2, true, false, false, null); // ui界面可以创建队列 /*** 队列绑定交换机* 参数1 队列名称 * 参数2 交换机* 参数3 routingkey-路由键 */
// channel.queueBind(TOPIC_QUEUE_2 TOPIC_EXCHANGE, "*.delete"); // ui界面可以把队列绑定到交换机 /* 创建消费者,设置消息处理逻辑 */Consumer consumer = new DefaultConsumer(channel) {/** * @param consumerTag 消费者标签,在 channel.basicConsume 可以指定 * @param envelope 消息包内容,包括消息id,消息routingkey,交换机,消息和重转标记(收到消息失败后是否需要重新发送) * @param properties 基本属性* @param body 消息字节数组 */@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,BasicProperties properties, byte[] body) throws IOException {System.out.println("=== 消费者1 start ===");System.out.println("路由key=" + envelope.getRoutingKey());System.out.println("交换机=" + envelope.getExchange());System.out.println("消息id=" + envelope.getDeliveryTag()); String message = new String(body, "UTF-8");System.out.println(String.format("消费者收到的消息【%s】", message)); System.out.println("=== 消费者1 end ===\n"); } };/*** 监听消息 * 参数1 队列名称 * 参数2 是否自动确认, 设置为true表示消息接收到自动向 mq回复ack;mq收到ack后会删除消息; 设置为false则需要手动发送ack; * 参数3 消息接收后的回调 */channel.basicConsume(TOPIC_QUEUE_2, true, consumer); }
}
【3】 rabbitmq 模式总结
8.1)模式1 简单模式 helloworld
一个生产者,一个消费者,不需要设置交换机,使用默认交换机;
8.2)模式2 工作队列模式 work queue
一个生产者,多个消费者(竞争关系),不需要设置交换机(使用默认交换机);
8.3)发布订阅模式 publish/subscribe
需要设置类型为 fanout-广播的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列;
8.4)路由模式 routing
需要设置类型为 direct的交换机, 交换机和队列进行绑定,并且指定routing key,当发送消息到交换机后,交换机会根据routing key 将消息发送到对应队列;
8.5)通配符模式 topic
需要设置类型为 topic的交换机, 交换机和队列进行绑定, 并且指定通配符方式的routing key, 当发送消息到交换机后,交换机会根据 routing key将消息发送到对应的队列;
rabbitmq-通配符模式相关推荐
- (需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试
背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:通配符模式,如果对R ...
- RabbitMQ通配符模式
通配符模式 一个消息发送者,发送消息 每个消息接收者,都已一个独立的队列 消息会发送到交换机,由交换机发送到队列 根据key,模糊匹配,来接收消息 Send 发送者 package cn.itcast ...
- (需求实战_进阶_05)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试
接上一篇: 文章目录 一.RabbitMQ 配置文件 1. RabbitMQ 生产者配置文件更新 二.启动项目 2.1. 启动项目 2.2. 清空控制台 三.管控台总览 3.1. 登录管控台 3.2. ...
- RabbitMQ通配符模式以及与Routing模式的区别
- RabbitMQ的Topics 通配符模式(Topic)
RabbitMQ的Topics 通配符模式(Topic) 模式说明 Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列.只不过 Topic 类型Exch ...
- RabbitMQ消息队列(六):SpringBoot整合之通配符模式
RabbitMQ消息队列(六):SpringBoot整合之通配符模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AeZQrNHS-1660220618697)(E: ...
- (需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试
背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:订阅模式,如果对Ra ...
- rabbitMq工作模式特性及整合springboot
因为公司项目后面需要用到mq做数据的同步,所以学习mq并在此记录,这里的是rabbitMq mq(message queue)消息队列 官网:www.rabbitmq.com 使用消息队列的优点:1. ...
- RabbitMQ初步到精通-第四章-RabbitMQ工作模式-Routing
第四章-RabbitMQ工作模式-Routing 1.模式介绍 1.1 模式 路由模式-继续还是和Exchange打交道,上节提到的Exchange类型为Fanout,此次声明的类型为direct 与 ...
- RabbitMQ六大模式
RabbitMQ六大模式 文章目录 前言 一.简单模式 二.Work queues工作队列模式 三.Publish/Subscribe发布与订阅模式 四.Routing路由模式 五.Topics通配符 ...
最新文章
- Redis学习和环境搭建
- linux 清理指定大小的文件
- CSS样式优先级与权重计算方式
- 微信小程序配置WSS协议
- Oracle之表分区、分区索引(一)
- hibernate 使用别名查询
- C++是什么?怎么学?学完了能得到什么?
- 小红书创始人瞿芳回应裁员风波:战略部署清晰 人员翻倍
- PHP中的session分析与使用
- JavaWeb 如何从FTP服务器下载文件 页面如何获取到FTP服务器上的图片进行显示
- 试用期没到辞职有工资吗?
- Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面
- 大学计算机基础知识点图文,大学计算机基础知识点分布最新版
- Revit 二次开发 未能加载文件或程序集“Microsoft.Xaml.Behaviors”或它的某一个依赖项
- 大学心理学课本_儿童心理学(第六版)/普通高等教育国家级规划教材
- 上白泽慧音 - C++
- MFC的CRect介绍
- 多线程应用---使用WaveOut* API开发AMR音频播放器(含源码下载)
- 运用无限级分类管理数据库原理详解
- 服务器充电桩是什么显示,服务区有充电桩吗,汽车充电桩介绍
热门文章
- CF1037H. Security
- P3899 [湖南集训]谈笑风生
- 牛客题霸 [容器盛水问题] C++题解/答案
- 牛客题霸 [ 旋转数组的最小数字] C++题解/答案
- POJ1236 Network of Schools
- [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
- NOIP2018洛谷P5021:修建赛道
- CF1416E-Split【dp,set】
- YbtOJ#20060-[NOIP2020模拟赛B组Day3]字串修改【模拟】
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链