当前位置: 首页 > news >正文

RabbitMQ交换机(3)-Topic

1.Topic模式

RabbitMQ的Topic模式是一种基于主题的消息传递模式。它允许发送者向一个特定的主题(topic)发布消息,同时,订阅者也可以针对自己感兴趣的主题进行订阅。

在Topic模式中, 主题通过一个由单词和点号组成的字符串来描述。例如,“#.china”表示匹配所有以“china”为结尾的主题,比如“bj.china”或“china”等。( ‘ # ’ 和 ‘ * ’ 会再后面介绍)

当一个消息被发布到Topic交换机(Exchange)时,交换机会将消息转发给所有与该主题匹配的队列。消费者(即订阅者)可以对队列进行绑定,通过指定自己感兴趣的主题进行绑定。

通过使用Topic模式,我们可以实现高度灵活的信息交换模式,同时,确保只有感兴趣的消费者才会收到消息,提高了系统的效率和可靠性。

  1. *匹配1个
  2. #匹配0个或多个
  3. 当一个队列绑定键是#,那么这个队列将接收所有数据,就有点像 fanout 了
  4. 如果队列绑定键当中没有#和*出现,那么该队列绑定类型就是 direct 了
    在这里插入图片描述

2. 生产者

在这里插入图片描述
在这里插入图片描述

package com.hong.rabbitmq8;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;/*** @Description: Topic模式生产者* @Author: hong* @Date: 2024-01-16 20:09* @Version: 1.0**/
public class TopicSend {private static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtil.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);Map<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("lazy.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 bindingKey = bindingKeyEntry.getKey();String message = bindingKeyEntry.getValue();channel.basicPublish(EXCHANGE_NAME, bindingKey, null, message.getBytes(StandardCharsets.UTF_8));System.out.println("消息发送完成------" +bindingKey+ message);}}
}

3.消费者1

package com.hong.rabbitmq8;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.nio.charset.StandardCharsets;/*** @Description: Topic模式接受者1-接收*.orange.** @Author: hong* @Date: 2024-01-16 20:07* @Version: 1.0**/
public class TopicReceiver1 {public static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtil.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);String queueName = "Q1";channel.queueDeclare(queueName,false,false,false,null);channel.queueBind(queueName,EXCHANGE_NAME,"*.orange.*");DeliverCallback deliverCallback = (comsumerTag, message) -> {System.out.println("接收队列:" + queueName + ",routingKey:" + message.getEnvelope().getRoutingKey() + ",消息:" + new String(message.getBody(), StandardCharsets.UTF_8));};CancelCallback cancelCallback = var -> {};channel.basicConsume(queueName,true,deliverCallback,cancelCallback);}
}

4.消费者2

package com.hong.rabbitmq8;import com.hong.utils.RabbitMQUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;import java.nio.charset.StandardCharsets;/*** @Description: Topic模式接受者1-接收*.*.rabbit和lazy.#* @Author: hong* @Date: 2024-01-16 20:07* @Version: 1.0**/
public class TopicReceiver2 {public static final String EXCHANGE_NAME = "topic_logs";public static void main(String[] args) throws Exception {Channel channel = RabbitMQUtil.getChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);String queueName = "Q2";channel.queueDeclare(queueName,false,false,false,null);channel.queueBind(queueName,EXCHANGE_NAME,"*.*.rabbit");channel.queueBind(queueName,EXCHANGE_NAME,"lazy.#");DeliverCallback deliverCallback = (comsumerTag, message) -> {System.out.println("接收队列:" + queueName + ",routingKey:" + message.getEnvelope().getRoutingKey() + ",消息:" + new String(message.getBody(), StandardCharsets.UTF_8));};CancelCallback cancelCallback = var -> {};channel.basicConsume(queueName,true,deliverCallback,cancelCallback);}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

例子说明
quick.orange.rabbit被队列 Q1Q2 接收到
lazy.orange.elephant被队列 Q1Q2 接收到
quick.orange.fox被队列 Q1 接收到
lazy.brown.fox被队列 Q2 接收到
lazy.pink.rabbit虽然满足两个绑定但只被队列 Q2 接收一次
quick.brown.fox不匹配任何绑定不会被任何队列接收到会被丢弃
quick.orange.male.rabbit是四个单词不匹配任何绑定会被丢弃
lazy.orange.male.rabbit是四个单词但匹配 Q2
http://www.lryc.cn/news/283512.html

相关文章:

  • 前端密钥怎么存储,以及临时存储一些数据,如何存储才最安全?
  • 第16章_网络编程拓展练习(TCP编程,UDP编程)
  • 深入Docker5:安装nginx部署完整项目
  • HBASE学习四:常用命令汇总梳理(包括数据库、zk、hdfs相关操作与配置)
  • Android平台RTSP|RTMP播放端实时快照保存JPG还是PNG?
  • 【人工智能】之深入了解嵌入模型中的 Token:NLP 中的语义之旅(1)
  • UML-实现图(组件图和部署图)
  • 苹果Find My可查找添加32件物品,伦茨科技ST17H6x芯片加速产品赋能
  • postman后端测试时invalid token报错+token失效报错解决方案
  • 使用 mybatis-plus 的mybaits的一对多时, total和record的不匹配问题
  • SpringCloud之Nacos
  • 小封装高稳定性振荡器 Sg2520egn / sg2520vgn, sg2520ehn / sg2520vhn
  • 使用 Apache POI 更新/覆盖 特定的单元格
  • Spring Boot整合MyBatis-Plus
  • springboot项目之AOP角色权限的判断
  • Twincat PLC 跳出循环
  • 【Leetcode】277.搜寻名人
  • 小白数学建模 Mathtype 7.7傻瓜式下载安装嵌入Word/WPS以及深度使用教程
  • Linux之which和find
  • MySQL 常规操作指南
  • Rocketmq rust版本-开篇
  • springboot3+springsecurity6集成druid启动报错
  • golang面试题大全
  • Google 在裁员的路上一路狂奔
  • 橘子学K8S04之重新认识Docker容器
  • Day31- 贪心算法part05
  • 基于springboot+vue的蜗牛兼职网的设计与实现系统(前后端分离)
  • 【音视频原理】图像相关概念 ② ( 帧率 | 常见帧率标准 | 码率 | 码率单位 )
  • CSS Position总结:定位属性的实战技巧
  • python基础系列二-函数