Spring Boot整合RabbitMQ实例(Topic模式)

发布时间 - 2026-01-11 00:50:48    点击率:

1.Topic交换器介绍

Topic Exchange 转发消息主要是根据通配符。 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发消息。

在这种交换机模式下:

    路由键必须是一串字符,用句号(.) 隔开,比如说 agreements.us,或者 agreements.eu.stockholm 等。

    路由模式必须包含一个 星号(*),主要用于匹配路由键指定位置的一个单词,比如说,一个路由模式是这样子:agreements..b.*,那么就只能匹配路由键是这样子的:第一个单词是 agreements,第四个单词是 b。 井号(#)就表示相当于一个或者多个单词,例如一个匹配模式是agreements.eu.berlin.#,那么,以agreements.eu.berlin开头的路由键都是可以的。
具体代码发送的时候还是一样,第一个参数表示交换机,第二个参数表示routing key,第三个参数即消息。如下:

rabbitTemplate.convertAndSend("testTopicExchange","key1.a.c.key2", " this is  RabbitMQ!");

topic 和 direct 类似, 只是匹配上支持了"模式", 在"点分"的 routing_key 形式中, 可以使用两个通配符:

*表示一个词.

#表示零个或多个词.

如上图所示:此类交换器使得来自不同的源头的消息可以到达一个对列,其实说的更明白一点就是模糊匹配的意思,例如:上图中红色对列的routekey为usa.#,#代表匹配任意字符,但是要想消息能到达此对列,usa.必须匹配后面的#好可以随意。图中usa.news,usa.weather都能找到红色队列,符号“#”匹配一个或多个词,符号“”匹配不多不少一个词。因此“usa.#”能够匹配到“usa.news.XXX”,但是“usa.” 只会匹配到“usa.XXX”。
注:交换器说到底是一个名称与队列绑定的列表。当消息发布到交换器时,实际上是由你所连接的信道,将消息路由键同交换器上绑定的列表进行比较,最后路由消息

2.示例代码

1).RabbitMQ的Topic的bean配置

RabbitTopic.java类:

package com.example.rabbitmqtopic;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitTopic {
 final static String message = "topic.message";
 final static String messages = "topic.messages";
 //创建队列
 @Bean
 public Queue queueMessage() {
  return new Queue(RabbitTopic.message);
 }
 //创建队列
 @Bean
 public Queue queueMessages() {
  return new Queue(RabbitTopic.messages);
 }
 //创建交换器
 @Bean
 TopicExchange exchange() {
  return new TopicExchange("topicExchange");
 }
  //对列绑定并关联到ROUTINGKEY
 @Bean
 Binding bindingExchangeMessage(Queue queueMessage, TopicExchange exchange) {
  return BindingBuilder.bind(queueMessage).to(exchange).with("topic.message");
 }
 //对列绑定并关联到ROUTINGKEY
 @Bean
 Binding bindingExchangeMessages(Queue queueMessages, TopicExchange exchange) {
  return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");//*表示一个词,#表示零个或多个词
  }
}

2).消息生产者生产消息

TopicSender.java类:

package com.example.rabbitmqtopic.rabbitmq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TopicSender {
 @Autowired
 private AmqpTemplate rabbitTemplate;
 public void send() {
  String context = "hi, i am message all";
  System.out.println("Sender : " + context);
  this.rabbitTemplate.convertAndSend("topicExchange", "topic.1", context);
 }
 public void send1() {
  String context = "hi, i am message 1";
  System.out.println("Sender : " + context);
  this.rabbitTemplate.convertAndSend("topicExchange", "topic.message", context);
 }
 public void send2() {
  String context = "hi, i am messages 2";
  System.out.println("Sender : " + context);
  this.rabbitTemplate.convertAndSend("topicExchange", "topic.messages", context);
  }
}

3).消息消费者

TopicReceiver.java类:

package com.example.rabbitmqtopic.rabbitmq;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = "topic.message")
public class TopicReceiver {
 @RabbitHandler
 public void process(String message) {
  System.out.println("Topic Receiver1 : " + message);
 }
}

TopicReceiver2.java类:

package com.example.rabbitmqtopic.rabbitmq;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = "topic.messages")
public class TopicReceiver2 {
 @RabbitHandler
 public void process(String message) {
  System.out.println("Topic Receiver2 : " + message);
 }
}

4).测试

RabbitMQTopicTest.java类:

package com.example.rabbitmqtopic.rabbitmq;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMQTopicTest {
 @Autowired
 private TopicSender sender;
 @Test
 public void topic() throws Exception {
  sender.send();
 }
 @Test
 public void topic1() throws Exception {
  sender.send1();
 }
 @Test
 public void topic2() throws Exception {
  sender.send2();
 }
}

以上所述是小编给大家介绍的Spring Boot整合RabbitMQ实例(Topic模式),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# springboot整合  # rabbitmq  # kafka监控获取指定topic的消息总量示例  # kafka-python 获取topic lag值方式  # kafka 启动报错 missingTopicsFatal is true的解决  # 详解Springboot整合ActiveMQ(Queue和Topic两种模式)  # spring boot使用RabbitMQ实现topic 主题  # TOPI如何使TVM代码不那么样板化  # 多个  # 绑定  # 交换器  # 在这种  # 第一个  # 这样子  # 小编  # 图中  # 都是  # 是一个  # 在此  # 都能  # 是由  # 不多不少  # 信道  # 只会  # 要想  # 第二个  # 给大家  # 此类 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何自定义建站之星网站的导航菜单样式?  如何挑选高效建站主机与优质域名?  BootStrap整体框架之基础布局组件  如何在宝塔面板中修改默认建站目录?  高端建站三要素:定制模板、企业官网与响应式设计优化  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel如何实现本地化和多语言支持?(i18n教程)  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何破解联通资金短缺导致的基站建设难题?  js实现点击每个li节点,都弹出其文本值及修改  制作公司内部网站有哪些,内网如何建网站?  如何续费美橙建站之星域名及服务?  Windows Hello人脸识别突然无法使用  教你用AI将一段旋律扩展成一首完整的曲子  Laravel如何自定义分页视图?(Pagination示例)  Laravel怎么上传文件_Laravel图片上传及存储配置  使用Dockerfile构建java web环境  网站建设保证美观性,需要考虑的几点问题!  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何获取免费开源的自助建站系统源码?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  打造顶配客厅影院,这份100寸电视推荐名单请查收  个人网站制作流程图片大全,个人网站如何注销?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何基于云服务器快速搭建网站及云盘系统?  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  PHP 500报错的快速解决方法  如何实现javascript表单验证_正则表达式有哪些实用技巧  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何快速查询网站的真实建站时间?  常州企业网站制作公司,全国继续教育网怎么登录?  linux top下的 minerd 木马清除方法  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  移动端脚本框架Hammer.js  如何在IIS服务器上快速部署高效网站?  Laravel怎么实现模型属性的自动加密  Angular 表单中正确绑定输入值以确保提交与验证正常工作  微信小程序 五星评分(包括半颗星评分)实例代码  EditPlus 正则表达式 实战(3)  Android滚轮选择时间控件使用详解  如何快速搭建自助建站会员专属系统?  javascript中对象的定义、使用以及对象和原型链操作小结  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】