【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-通配符模式相关推荐

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

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

  2. RabbitMQ通配符模式

    通配符模式 一个消息发送者,发送消息 每个消息接收者,都已一个独立的队列 消息会发送到交换机,由交换机发送到队列 根据key,模糊匹配,来接收消息 Send 发送者 package cn.itcast ...

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

    接上一篇: 文章目录 一.RabbitMQ 配置文件 1. RabbitMQ 生产者配置文件更新 二.启动项目 2.1. 启动项目 2.2. 清空控制台 三.管控台总览 3.1. 登录管控台 3.2. ...

  4. RabbitMQ通配符模式以及与Routing模式的区别

  5. RabbitMQ的Topics 通配符模式(Topic)

    RabbitMQ的Topics 通配符模式(Topic) 模式说明 Topic 类型与 Direct 相比,都是可以根据 RoutingKey 把消息路由到不同的队列.只不过 Topic 类型Exch ...

  6. RabbitMQ消息队列(六):SpringBoot整合之通配符模式

    RabbitMQ消息队列(六):SpringBoot整合之通配符模式 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AeZQrNHS-1660220618697)(E: ...

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

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

  8. rabbitMq工作模式特性及整合springboot

    因为公司项目后面需要用到mq做数据的同步,所以学习mq并在此记录,这里的是rabbitMq mq(message queue)消息队列 官网:www.rabbitmq.com 使用消息队列的优点:1. ...

  9. RabbitMQ初步到精通-第四章-RabbitMQ工作模式-Routing

    第四章-RabbitMQ工作模式-Routing 1.模式介绍 1.1 模式 路由模式-继续还是和Exchange打交道,上节提到的Exchange类型为Fanout,此次声明的类型为direct 与 ...

  10. RabbitMQ六大模式

    RabbitMQ六大模式 文章目录 前言 一.简单模式 二.Work queues工作队列模式 三.Publish/Subscribe发布与订阅模式 四.Routing路由模式 五.Topics通配符 ...

最新文章

  1. Redis学习和环境搭建
  2. linux 清理指定大小的文件
  3. CSS样式优先级与权重计算方式
  4. 微信小程序配置WSS协议
  5. Oracle之表分区、分区索引(一)
  6. hibernate 使用别名查询
  7. C++是什么?怎么学?学完了能得到什么?
  8. 小红书创始人瞿芳回应裁员风波:战略部署清晰 人员翻倍
  9. PHP中的session分析与使用
  10. JavaWeb 如何从FTP服务器下载文件 页面如何获取到FTP服务器上的图片进行显示
  11. 试用期没到辞职有工资吗?
  12. Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面
  13. 大学计算机基础知识点图文,大学计算机基础知识点分布最新版
  14. Revit 二次开发 未能加载文件或程序集“Microsoft.Xaml.Behaviors”或它的某一个依赖项
  15. 大学心理学课本_儿童心理学(第六版)/普通高等教育国家级规划教材
  16. 上白泽慧音 - C++
  17. MFC的CRect介绍
  18. 多线程应用---使用WaveOut* API开发AMR音频播放器(含源码下载)
  19. 运用无限级分类管理数据库原理详解
  20. 服务器充电桩是什么显示,服务区有充电桩吗,汽车充电桩介绍

热门文章

  1. CF1037H. Security
  2. P3899 [湖南集训]谈笑风生
  3. 牛客题霸 [容器盛水问题] C++题解/答案
  4. 牛客题霸 [ 旋转数组的最小数字] C++题解/答案
  5. POJ1236 Network of Schools
  6. [TJOI2013]拯救小矮人(反悔贪心证明),「ICPC World Finals 2019」Hobson 的火车(基环树,差分)
  7. NOIP2018洛谷P5021:修建赛道
  8. CF1416E-Split【dp,set】
  9. YbtOJ#20060-[NOIP2020模拟赛B组Day3]字串修改【模拟】
  10. 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链