前言

RabbitMQ六种队列模式-简单队列
RabbitMQ六种队列模式-工作队列
RabbitMQ六种队列模式-发布订阅
RabbitMQ六种队列模式-路由模式
RabbitMQ六种队列模式-主题模式 [本文]

从前面的几篇我们依次经历了 exchange 模式从 fanout > direct 的转变过程,在 fanout 时,我们只能进行简单的广播,对应类型比较单一,使用 direct 后,消费者则可以进行一定程度的选择,但是,direct 还是有局限性,路由不支持多个条件。

怎么讲呢?

direct 不支持匹配 routingKey,一但绑定了就是绑定了,而 topic 主题模式支持规则匹配,只要符合 routingKey 就能发送到绑定的队列上。

文章目录

  • 前言
  • 1. 什么是主题模式
  • 2. 代码部分
    • 2.1 生产者
    • 2.2 *消费者
    • 2.3 #消费者
    • 2.4 运行截图
  • 3. 总结

1. 什么是主题模式

官方链接:http://www.rabbitmq.com/tutorials/tutorial-five-java.html

topics 主题模式跟 routing 路由模式类似,只不过路由模式是指定固定的路由键 routingKey,而主题模式是可以模糊匹配路由键 routingKey,类似于SQL中 = 和 like 的关系。


P 表示为生产者、 X 表示交换机、C1C2 表示为消费者,红色表示队列。

topics 模式与 routing 模式比较相近,topics 模式不能具有任意的 routingKey,必须由
一个英文句点号“.”分隔的字符串(我们将被句点号“.”分隔开的每一段独立的字符串称为一个单词),比如 “lazy.orange.fox”。topics routingKey 中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。

“*” 表示任何一个词
“#” 表示0或1个词

以上图中的配置为例:

如果一个消息的 routingKey 设置为 “xxx.orange.rabbit”,那么该消息会同时路由到 Q1 与 Q2,routingKey="lazy.orange.fox”的消息会路由到Q1与Q2;

routingKey="lazy.brown.fox”的消息会路由到 Q2;

routingKey="lazy.pink.rabbit”的消息会路由到 Q2(只会投递给Q2一次,虽然这个routingKey 与 Q2 的两个 bindingKey 都匹配);

routingKey="quick.brown.fox”、routingKey="orange”、routingKey="quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey。

接下来代码为例:

2. 代码部分

2.1 生产者

public class ProducerTopic {private static final String EXCHANGE_NAME = "my_topic_exchange";public static void main(String[] args) throws IOException, TimeoutException {/** 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/** 2.创建通道 */Channel channel = connection.createChannel();/** 3.绑定的交换机 参数1交互机名称 参数2 exchange类型 */channel.exchangeDeclare(EXCHANGE_NAME, "topic");/** 4.发送消息 */String routingKey = "log.info.error";String msg = "topic_exchange_msg:" + routingKey;System.out.println("[send] = " + msg);channel.basicPublish(EXCHANGE_NAME, routingKey, null, msg.getBytes());/** 5.关闭通道、连接 */channel.close();connection.close();/** 注意:如果消费没有绑定交换机和队列,则消息会丢失 */}
}

2.2 *消费者

public class ConsumerLogXTopic {private static final String QUEUE_NAME = "topic_consumer_info";private static final String EXCHANGE_NAME = "my_topic_exchange";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("log * 消费者启动");/* 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/* 2.创建通道 */Channel channel = connection.createChannel();/* 3.消费者关联队列 */channel.queueDeclare(QUEUE_NAME, false, false, false, null);/* 4.消费者绑定交换机 参数1 队列 参数2交换机 参数3 routingKey */channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "log.*");DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String msg = new String(body, "UTF-8");System.out.println("消费者获取生产者消息:" + msg);}};/* 5.消费者监听队列消息 */channel.basicConsume(QUEUE_NAME, true, consumer);}}

2.3 #消费者

public class ConsumerLogJTopic {private static final String QUEUE_NAME = "topic_consumer_info";private static final String EXCHANGE_NAME = "my_topic_exchange";public static void main(String[] args) throws IOException, TimeoutException {System.out.println("log # 消费者启动");/* 1.创建新的连接 */Connection connection = MQConnectionUtils.newConnection();/* 2.创建通道 */Channel channel = connection.createChannel();/* 3.消费者关联队列 */channel.queueDeclare(QUEUE_NAME, false, false, false, null);/* 4.消费者绑定交换机 参数1 队列 参数2交换机 参数3 routingKey */channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "log.#");DefaultConsumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)throws IOException {String msg = new String(body, "UTF-8");System.out.println("消费者获取生产者消息:" + msg);}};/* 5.消费者监听队列消息 */channel.basicConsume(QUEUE_NAME, true, consumer);}}

2.4 运行截图

生产者

星花*消费者

#消费者

3. 总结

1、topic 相对于之前几种算是比较复杂了,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),exchange 会将消息转发到所有关注主题能与 routeKey 模糊匹配的队列。

2、在进行绑定时,要提供一个该队列关心的主题,如“#.sscai.#”表示该队列关心所有涉及 sscai 的消息(一个 routeKey 为 "club.sscai.tmax”的消息会被转发到该队列)。

3、"#”表示0个或若干个关键字,“”表示一个关键字。如“club.”能与“club.sscai”匹配,无法与“club.sscai.xxx”匹配;但是“club.#”能与上述两者匹配。

4、同样,如果 exchange 没有发现能够与 routeKey 匹配的 Queue,则会抛弃此消息。

案例代码:https://www.lanzous.com/i5ydu6d

我创建了一个java相关的公众号,用来记录自己的学习之路,感兴趣的小伙伴可以关注一下微信公众号哈:niceyoo

RabbitMQ六种队列模式-主题模式相关推荐

  1. 【转】RabbitMQ六种队列模式-5.主题模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列模式-主题 ...

  2. RabbitMQ六种队列模式-简单队列模式

    前言 RabbitMQ六种队列模式-简单队列 [本文] RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  3. RabbitMQ六种队列模式-工作队列模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 [本文] RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  4. RabbitMQ六种队列模式-发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  5. 【转】RabbitMQ六种队列模式-4.路由模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 [本文] RabbitMQ六种队列 ...

  6. 【转】RabbitMQ六种队列模式-3.发布订阅模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 [本文] RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  7. 【转】RabbitMQ六种队列模式-2.工作队列模式

    前言 RabbitMQ六种队列模式-简单队列 RabbitMQ六种队列模式-工作队列 [本文] RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  8. 【转】RabbitMQ六种队列模式-1.简单队列模式

    前言 RabbitMQ六种队列模式-简单队列 [本文] RabbitMQ六种队列模式-工作队列 RabbitMQ六种队列模式-发布订阅 RabbitMQ六种队列模式-路由模式 RabbitMQ六种队列 ...

  9. RabbitMQ六种工作模式—主题模式

    1.主题模式下 发送到类型是 topic 交换机的消息的 routing_key 不能随意写,必须满足一定的要求,它必须是一个单词列表,以点号分隔开.这些单词可以是任意单词,比如: "sto ...

最新文章

  1. 程序员的快速开发框架:Github上 10 大优秀的开源后台控制面板
  2. set python_python基础:集合-set()
  3. golang函数调用机制:多返回值,_返回值忽略
  4. 08.MyBatis整合Log4j
  5. 【codevs1262】不要把球传给我,非常无语的一道题目
  6. 搭建外文技术博客程序员都应该有自己的博客
  7. JavaScript年月日和时间戳互转
  8. 在IAR下移植CC2650 contiki工程
  9. face_recognition实现人脸相似度比较
  10. php cimage类,强大的多功能的用VB编写的高速图像处理库Cimage简介! - 小志的日志 - 电子工程世界-论坛...
  11. 交换机Trunk详解
  12. 61家第三方收单机构、247家商业银行、70家农商银行及119家村镇银行收单机构号
  13. 大学生体育课期末大作业
  14. Excel 的基本概念以及 Excel 文件的创建
  15. 基于PHP+MySQL的学生档案管理系统设计与实现
  16. PYTHON代码:根据FileRecord和MAP的关系,拼接IBM V7000 精简卷碎片
  17. tableau函数与计算之二(表计算)
  18. 光猫、路由器和交换机区别
  19. oracle数据库中emp表,根据Oracle数据库scott模式下的emp表和dept表
  20. NLP 学习秘笈,从入门到进阶 | 书单

热门文章

  1. 工作63:await和anync
  2. 前端学习(1701):前端系列javascript之闭包
  3. 前端学习(1525):简化模板代码
  4. mybatis学习(34):动态sql-choose
  5. spring学习(15):required属性
  6. 三相阻容降压供电DCDC电源
  7. Linux SPI总线和设备驱动架构
  8. 根据父类id查询所有的父级_父类子类抽象类,super final 重写方法,搞懂继承中复杂的知识点...
  9. EXCEL数据汇总-数据透视图
  10. 惊了!最通俗易懂的Djongo入门竟然在这里!