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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AeZQrNHS-1660220618697)(E:\typora\image\image-20220811183652501.png)]

路由模式是在订阅模式的基础上加上了路由键key,交换机只分发消息到绑定在交换机上面指定路由键的队列。

1. 环境准备

参考:https://blog.csdn.net/fatestranger/article/details/126284433?spm=1001.2014.3001.5501

交换机&队列:

public class TopicConstants {public static final String TOPIC_EXCHANGE_NAME = "amq.topic";public static final String TV_TOPIC_QUEUE_NAME = "topic.TV";public static final String PHONE_TOPIC_QUEUE_NAME = "topic.TV.phone";public static final String PAPER_TOPIC_QUEUE_NAME = "topic.TV.phone.paper";}

2. 生产者

配置交换机和绑定的队列:

RabbitMQRoutingConfig

@Configuration
public class RabbitMQRoutingConfig {//1、声明注册direct式交换机@Beanpublic DirectExchange directExchange() {return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false);}/*2. 声明队列*/@Beanpublic Queue TVFanoutQueue() {/*Queue构造函数参数说明1. 队列名2. 是否持久化 true:持久化 false:不持久化*/return new Queue(TV_FANOUT_QUEUE_NAME, true);}@Beanpublic Queue phoneFanoutQueue() {/*Queue构造函数参数说明1. 队列名2. 是否持久化 true:持久化 false:不持久化*/return new Queue(PHONE_FANOUT_QUEUE_NAME, true);}//@Beanpublic Queue paperFanoutQueue() {/*Queue构造函数参数说明1. 队列名2. 是否持久化 true:持久化 false:不持久化*/return new Queue(PAPER_FANOUT_QUEUE_NAME, true);}//3、完成交换机和队列的绑定关系@Beanpublic Binding TVDirectBinding() {return BindingBuilder.bind(TVFanoutQueue()).to(directExchange()).with("TV");}@Beanpublic Binding phoneDirectBinding() {return BindingBuilder.bind(phoneFanoutQueue()).to(directExchange()).with("phone");}@Beanpublic Binding paperDirectBinding() {return BindingBuilder.bind(paperFanoutQueue()).to(directExchange()).with("paper");}}

模拟产生消息:

DirectController

@RestController
@Slf4j
public class DirectController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/directQueue")public String sendMsg(@RequestParam String message, @RequestParam String routeKey) {log.info("message:{}, routeKey: {}", message, routeKey);rabbitTemplate.convertAndSend(DIRECT_EXCHANGE_NAME, routeKey, message);//返回消息return "OK!";}
}

3.消费者

三个消费者:

RoutingReceiver

@Component
@Slf4j
public class RoutingReceiver {@Autowiredprivate MqReceiveService mqReceiveService;@RabbitListener(queues = "TV-fanout-queue")public void processTV(String msg) {log.info("队列:TV-fanout-queue,接收msg: {} ", msg);//消息消费存储MqReceive mqReceive = new MqReceive();mqReceive.setType("direct");mqReceive.setReceive("TV-fanout-queue");mqReceive.setContent(msg);mqReceiveService.insetMsg(mqReceive);}@RabbitListener(queues = "phone-fanout-queue")public void processPhone(String msg) {log.info("队列:phone-fanout-queue,接收msg: {} ", msg);//消息消费存储MqReceive mqReceive = new MqReceive();mqReceive.setType("direct");mqReceive.setReceive("phone-fanout-queue");mqReceive.setContent(msg);mqReceiveService.insetMsg(mqReceive);}@RabbitListener(queues = "paper-fanout-queue")public void processPaper(String msg) {log.info("队列:paper-fanout-queue,接收msg: {} ", msg);//消息消费存储MqReceive mqReceive = new MqReceive();mqReceive.setType("direct");mqReceive.setReceive("paper-fanout-queue");mqReceive.setContent(msg);mqReceiveService.insetMsg(mqReceive);}}

测试:
http://localhost:8888/topicQueue?message=topic&routeKey=topic.1

http://localhost:8888/topicQueue?message=topic&routeKey=topic.TV.1

http://localhost:8888/topicQueue?message=topic&routeKey=topic.1.1

4. 模式总结

  1. 简单模式 HelloWorld 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机);
  2. 工作队列模式 Work Queue 一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机);
  3. 发布订阅模式 Publish/subscribe 需要设置类型为 fanout 的交换机,并且交换机和队列进行绑定,当发送消息到交换机后,交换机会将消息发送到绑定的队列;
  4. 路由模式 Routing 需要设置类型为 direct 的交换机,交换机和队列进行绑定,并且指定 routing key,当发送消息到交换机后,交换机会根据 routingkey 将消息发送到对应的队列;
  5. 通配符模式 Topic 需要设置类型为 topic 的交换机,交换机和队列进行绑定,并且指定通配符方式的 routing key,当发送消息到交换机后,交换机会根据 routing key 将消息发送到对应的队列。

RabbitMQ消息队列(六):SpringBoot整合之通配符模式相关推荐

  1. rabbitmq消息队列入门到整合springboot(篇幅较长内容详细)

    1.安装rabbitmq服务器 我们选择在linux下安装 安装的前提需要在虚拟机下安装docker docker pull rabbitmq:management(拉去镜像) docker run ...

  2. php中rabbitmq消息乱码,PHP实现RabbitMQ消息队列(转)

    本篇文章给大家带来的内容是关于PHP和RabbitMQ实现消息队列的完整代码,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 先安装PHP对应的RabbitMQ,这里用的是 php_a ...

  3. RabbitMQ消息队列讲解(涵盖生产者消费者以及Springboot整合)

    文章目录 什么是消息队列 为什么用消息队列 常见MQ产品 RabbitMQ 特性 下载与安装 erlang RabbitMQ 工作原理 工作流程 消息模型 基本消息模型 生产者 消费者 消息确认机制( ...

  4. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列

    QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...

  5. RabbitMQ消息队列(一)《Java-2021面试谈资系列》

    RabbitMQ RabbitMQ消息队列 一.中间件 1.什么是中间件 2.中间件技术及架构概述 3.消息中间件 1.消息中间件的分布式架构 2.消息中间件使用场景 3.常见的消息中间件 4.消息中 ...

  6. JAVA03_21学习总结(RabbitMQ消息队列)

    今日内容 1. RabbitMQ 消息队列 Rabbitmq 消息队列基于AMQP协议的消息队列就是将本来一次性完成的,耗时的,需要等待的操作分离出来-形成一个单独的模块,就是消息队列-例子:普通方式 ...

  7. 初探 RabbitMQ 消息队列

    初探 RabbitMQ 消息队列 rabbitmq基础概念常见应用场景导入依赖属性配置具体编码定义队列实体类控制器消息消费者主函数测试总结说点什么 SpringBoot 是为了简化 Spring 应用 ...

  8. 消息队列——RabbitMQ消息队列集群

    RabbitMQ消息队列集群 消息队列/中间件 RabbitMQ详解 RabbitMQ单机部署 RabbitMQ集群部署 消息队列/中间件 一.前言 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中 ...

  9. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    上一篇已经讲了Rabbitmq如何在Windows平台安装,不懂请移步:RabbitMQ学习系列一:windows下安装RabbitMQ服务 一.理论: .net环境下,C#代码调用RabbitMQ消 ...

最新文章

  1. 太神奇的 SQL 查询经历,group by 慢查询优化!
  2. RAC分解步骤之一,在oracle linux 4u4上安装oracle 10.2.0.1.0操作日志
  3. logstic 回归
  4. Ello讲述Haar人脸检测:易懂、很详细、值得 ...
  5. mysql大数据量处理
  6. Thinkpad Access Connections实现快速的在各种网络间进行切换
  7. 【jQuery笔记Part3】02-jQuery抖动效果
  8. 插件开发之360 DroidPlugin源码分析(三)Binder代理
  9. 易语言PHP查询卡号,易语言卡密管理源码,易语言卡号密码管理软件源码
  10. 基于STM32设计的车库监控报警系统
  11. xp计算机限制打开u盘,处置xp系统电脑限制使用u盘的解决方法
  12. App消息推送 实现原理
  13. WhbtomT(半路出家) 的每日英语 收集 (三)
  14. 网站是备案域名还是服务器,网站备案是域名还是服务器
  15. 少儿编程学习(循环及条件语句)
  16. 【优化】共轭函数(Conjugate Function)超简说明
  17. vue动态面包屑导航的使用
  18. rpgmvp文件转换图片_干货|如何快速将图片转换成CAD文件格式
  19. 多进程log4j日志丢失问题分析
  20. 6. 批量处理分析数据

热门文章

  1. QR 二维码布局(五)
  2. 关于kswapd0 CPU占用率高的问题,原来是被植入挖矿程序
  3. css 背景样式设置
  4. 一加3t运行linux,【漏洞分析】获取已锁定的OnePlus 3/3T:引导加载程序漏洞
  5. 阿里开源android脚手架,GitHub - HiJesse/Gaea: Android 脚手架(组件化, 插件化)
  6. 【perl】学习手记(一)--基本类型及运算符
  7. 著名景点大全,最全的著名景点大全.
  8. odoo15 report 标签弃用
  9. Java 使用jacob实现各类办公文档(ppt,Excel,word,text,imge)转换成PDF
  10. sklearn学习笔记(一)——数据预处理 sklearn.preprocessing