• Topic类型的ExchangeDirect相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

  • Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

通配符规则:

  • #:匹配一个或多个词

  • *:匹配不多不少恰好1个词

举例:

  • item.#:能够匹配item.spu.insert 或者 item.spu

  • item.*:只能匹配item.spu


解释:

  • Queue1:绑定的是china.# ,因此凡是以 china.开头的routing key 都会被匹配到。包括china.news和china.weather
  • Queue2:绑定的是#.news ,因此凡是以 .news结尾的 routing key 都会被匹配。包括china.news和japan.news

举例:

public_topic 消息生产者

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMqTopic {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void testTopic1(){//发送的目标交换机String exchange = "itcast.topic";String message="我王二天下无敌1";rabbitTemplate.convertAndSend(exchange,"china.RAP",message);}@Testpublic void testTopic2(){//发送的目标交换机String exchange = "itcast.topic";String message="我王二天下无敌2";rabbitTemplate.convertAndSend(exchange,"yangshi.news",message);}@Testpublic void testTopic3(){//发送的目标交换机String exchange = "object.json";Student stu = new Student("王二", 1, new String[]{"sing", "dance", "rap"});rabbitTemplate.convertAndSend(exchange,"china.json",stu);}
}

配置

spring:rabbitmq:host: 192.168.23.130port: 5672username: itcastpassword: 123321virtual-host: /

consumer_topic 消息消费者

@Component
public class SpringRabbitListener {//- Topic交换机接收的消息RoutingKey必须是多个单词,以 `**.**` 分割//- Topic交换机与队列绑定时的bindingKey可以指定通配符//- `#`:代表0个或多个词//- `*`:代表1个词@RabbitListener(bindings = @QueueBinding(value = @Queue("topicQueue1"),exchange = @Exchange(value = "itcast.topic",type = ExchangeTypes.TOPIC),key = {"china.#"}))public void listenerTopicQueue1(String msg){System.out.println("topicQueue1接收的消息为"+msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue("topicQueue2"),exchange = @Exchange(value = "itcast.topic",type = ExchangeTypes.TOPIC),key = {"#.news"}))public void listenerTopicQueue2(String msg){System.out.println("topicQueue2接收的消息为"+msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue("topicQueue3"),exchange = @Exchange(value = "object.json",type = ExchangeTypes.TOPIC),key = {"#.json"}))public void listenerTopicQueue3(Student msg){System.out.println("topicQueue3接收的对象为"+msg);}
}

启动类配置对象转化可在可视化界面查看

@SpringBootApplication
public class MqTopicApplication {public static void main(String[] args) {SpringApplication.run(MqTopicApplication.class);}//配置消息转换器@Beanpublic MessageConverter jsonMessageConverter(){return new Jackson2JsonMessageConverter();}
}

配置

spring:rabbitmq:host: 192.168.23.130port: 5672username: itcastpassword: 123321virtual-host: /

所需依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency><!--json转化依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency>

父依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.9.RELEASE</version><relativePath/></parent><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><!--AMQP依赖,包含RabbitMQ--><dependencies><!--json转化依赖--><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

RabbitMQ--topic相关推荐

  1. rabbitmq+topic+java_译:5.RabbitMQ Java Client 之 Topics (主题)

    我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换),并且有可能选择性地接收日志. 虽然使用direct(直接交换)改进了我们的系统,但它仍然有局限性 - 它不 ...

  2. RabbitMq topic

    目录 概述 代码 结果 概述 上篇direct必须是生产者发布消息指定的routingKey和消费者在队列绑定时指定的routingKey完全相等时才能匹配到队列上.topic与direct不同,可以 ...

  3. rabbitmq topic 收不到数据_RabbitMQ和Kafka到底怎么选?

    作者:haolujunhttp://cnblogs.com/haolujun/p/9632835.html 前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特 ...

  4. RabbitMQ Topic exchange

    Topic exchange topic与之前的每个类型都不同(ps:废话每个都是不同的).Topic解决了我们另一个需求.举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出 ...

  5. RabbitMQ Topic交换机(生产者)

    /* * 声明主题交换机及相关队列 * 消费者C1 * */ public class ReceiveLogsTopic01 {//交换机名称public static final String EX ...

  6. RabbitMQ Topic交换机的作用

    介绍 发送到类型是topic交换机的消息的routing_key不能随意写,必须满足一定的要求,它必须是一个单词列表,以点号分隔开.这些单词可以是任意单词,比如说: "stock.usd.n ...

  7. RabbitMQ Topic模式

    一个生产者,一个交换机,两个队列,两个消费者 生产者创建Topic的exchange并且绑定到队列中,这次绑定可以通过*和#关键字,对指定RoutingKey内容,编写时注意格式 xxx.xxx.xx ...

  8. RabbitMQ Topic交换机(结果成功)

    public class EmitLogTopic {//交换机的名称public static final String EXCHANGE_NAME = "topic_logs" ...

  9. RabbitMq(七) Topic模式介绍及代码示例

    概述: 在上一文章中我们介绍了路由模式(Routing),routing模式是不同的消息队列绑定了不同的路由key,但是我们看出路由key为固定的字符串标记.而本章中的Topic模式则为在路由模式下, ...

  10. Springboot整合RabbitMQ,包含direct,topic,fanout三种模式的整合

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

最新文章

  1. 百度SLG拿下前锤子科技CTO钱晨,还要合并小鱼在家? | 极客头条
  2. 听说这是写毕业论文的你?
  3. js目标时间与当前时间差转换年月日天数
  4. 你真的了解NSNotificationCenter吗?
  5. php根据字符串生成变量名,PHP 自定义字符串中的变量名解析
  6. MapReduce-计数器
  7. URL(统一资源定位符)
  8. 各种光源(灯)的光谱
  9. oracle count over partition by,over (Partition by...) of oracle
  10. github-新建文件夹
  11. 解决Element的 InfiniteScroll 无限滚动组件报错
  12. 拓端tecdat|R语言分位数回归预测筛选有上升潜力的股票
  13. Silverlight 4 帮助文件例子的连接
  14. tf hub bigGan 猫变狗
  15. python爬虫用AI技术-破解企业工商数据抓取+网络爬虫+网站数据采集+数据抓取遇到的三大问题
  16. Unity开发常用工具
  17. 【Hexo】hexo在文章中添加图片
  18. 该填志愿了,国内大学计算机专业哪家强?
  19. Python从入门到实践第9章课后作业
  20. 小程序云开发实现微信支付完整代码

热门文章

  1. The 2019 ICPC Asia Shanghai Regional Contest
  2. C - Log Calculator FZU - 2036
  3. CF848E-Days of Floral Colours【dp,分治NTT】
  4. P3708-koishi的数学题【差分】
  5. P2679-子串【dp】
  6. jzoj4019-Path【dp】
  7. P4296-[AHOI2007]密码箱【数论】
  8. codeforces1012 B. Chemical table(并查集+思维)
  9. 漫画:什么是拜占庭将军问题
  10. Java中随机数的原理,以及使用时的注意点