主题模式

主题模式结构图:

主题模式实际上就是一种模糊匹配的模式,可以将routingKey以模糊匹配的方式去进行转发。

可以使用*#来表示:

  • *:任意的一个单词。
  • #:0个或多个单词。
  1. 定义配置类。

    1. import org.springframework.amqp.core.Binding;
    2. import org.springframework.amqp.core.BindingBuilder;
    3. import org.springframework.amqp.core.Exchange;
    4. import org.springframework.amqp.core.ExchangeBuilder;
    5. import org.springframework.amqp.core.Queue;
    6. import org.springframework.beans.factory.annotation.Qualifier;
    7. import org.springframework.context.annotation.Bean;
    8. import org.springframework.context.annotation.Configuration;
    9. /**
    10. * RabbitMQ配置类
    11. */
    12. @Configuration
    13. public class RabbitMqConfig {
    14. /**
    15. * 定义交换机,可以很多个
    16. * @return 交换机对象
    17. */
    18. @Bean
    19. public Exchange topicExchange(){
    20. return ExchangeBuilder.topicExchange("amq.topic").build();
    21. }
    22. /**
    23. * 定义消息队列
    24. * @return 消息队列对象
    25. */
    26. @Bean
    27. public Queue topicQueue(){
    28. return new Queue("topicQueue");
    29. }
    30. /**
    31. * 定义绑定关系
    32. * @return 绑定关系
    33. */
    34. @Bean
    35. public Binding binding(@Qualifier("topicExchange") Exchange exchange,
    36. @Qualifier("topicQueue") Queue queue){
    37. // 将定义的交换机和队列进行绑定
    38. return BindingBuilder
    39. // 绑定队列
    40. .bind(queue)
    41. // 到交换机
    42. .to(exchange)
    43. // 使用自定义的routingKey
    44. .with("*.test.#")
    45. // 不设置参数
    46. .noargs();
    47. }
    48. }
  2. 定义消费者。

    1. import org.springframework.amqp.rabbit.annotation.Queue;
    2. import org.springframework.amqp.rabbit.annotation.RabbitListener;
    3. import org.springframework.stereotype.Component;
    4. /**
    5. * 主题队列监听器
    6. */
    7. @Component
    8. public class TopicListener {
    9. /**
    10. * 监听主题队列消息
    11. */
    12. @RabbitListener(queuesToDeclare = {@Queue("topicQueue")})
    13. public void receiver(String message) {
    14. System.out.println("主题队列接收到消息:" + message);
    15. }
    16. }
  3. 定义生产者。

    1. import org.junit.jupiter.api.Test;
    2. import org.springframework.amqp.rabbit.core.RabbitTemplate;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.test.context.SpringBootTest;
    5. @SpringBootTest
    6. class RabbitMqSpringBootTests {
    7. /**
    8. * RabbitTemplate封装了大量的RabbitMQ操作,已经由Starter提供,因此直接注入使用即可
    9. */
    10. @Autowired
    11. private RabbitTemplate rabbitTemplate;
    12. /**
    13. * 生产者
    14. */
    15. @Test
    16. void producer() {
    17. rabbitTemplate.convertAndSend("amq.topic", "test.1", "Hello World 1");
    18. rabbitTemplate.convertAndSend("amq.topic", "1.test", "Hello World 2");
    19. rabbitTemplate.convertAndSend("amq.topic", "1.test.1", "Hello World 3");
    20. }
    21. }
  4. 启动服务。

    此时队列已创建。

    绑定关系已设置。

    启动生产者,发送消息。

    可以看到,第一条消息的routingKey(test.1)由于不匹配*.test.#而没有被队列接收到。

除了这里使用的默认主题交换机之外,还有一个叫做amq.rabbitmq.trace的交换机:

这是用于帮助记录和追踪生产者和消费者使用消息队列的交换机,它是一个内部的交换机,这里就不演示了。


RabbitMQ 09 主题模式的更多相关文章

  1. Rabbitmq(6) 主题模式

    * 匹配1个 # 匹配所有 发送者: package com.aynu.bootamqp.service; import com.aynu.bootamqp.commons.utils.Amqp; i ...

  2. RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)

    前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...

  3. RabbitMQ (七) 订阅者模式之主题模式 ( topic )

    主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...

  4. (八)RabbitMQ消息队列-通过Topic主题模式分发消息

    原文:(八)RabbitMQ消息队列-通过Topic主题模式分发消息 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过 ...

  5. RabbitMQ六种队列模式-主题模式

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

  6. 队列模式&主题模式

    # RabbitMQ 消息中间件 **Advanced Message Queuing Protocol (高级消息队列协议** The Advanced Message Queuing Protoc ...

  7. 【RabbitMQ】工作模式介绍

    一.前言 之前,笔者写过< CentOS 7.2 安装 RabbitMQ> 这篇文章,今天整理一下 RabbitMQ 相关的笔记便于以后复习. 二.模式介绍 在 RabbitMQ 官网上提 ...

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

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

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

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

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

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

随机推荐

  1. 第131篇:如何上传一个npm包

    好家伙, NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准.  NPM是世界上最大的软件注册表. 1.首先我们 ...

  2. 云原生:使用HPA和VPA实现集群扩缩容

    1 背景 我们之前介绍过,随着业务流量上涨之后,我们的系统需要适时的进行扩容. 数据存储层我们也介绍过MySQL的扩容 Scale UP(纵向扩展) 和 Scale Out(横向扩展) 垂直拆分(Sc ...

  3. 一文读懂图数据库 Nebula Graph 访问控制实现原理

    摘要:数据库权限管理对大家都很熟悉,然而怎么做好数据库权限管理呢?在本文中将详细介绍 Nebula Graph 的用户管理和权限管理. 本文首发 Nebula Graph 博客:https://neb ...

  4. STL-unordered_hashtable模拟实现

    #pragma once #include<vector> #include<string> #include<iostream> using std::cout; ...

  5. C++的智能指针

    #pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问题 ,指针指针需要的是浅拷贝,并且需要处理资源释放问题 ...

  6. [C/C++] PCWSTR LPCTSTR等等

    目录 为什么会有这个 L"" 宏 LPCWSTR字符串比较 wchar_t 和 char 之间转换 关于 ANSI编码 乌拉~~~ 这是我第一百篇博文咯~ 为什么会有这个 真的开发 ...

  7. [逆向] PE文件学习

    目录 概述 MS-DOS 头部 IMAGE_DOS_HEADER PE头 IMAGE_NT_HEADER IMAGE_FILE_HEADER IMAGE_OPTIONAL_HEADER32 数据目录列 ...

  8. 使用jenkins连接linux部署jar包

    jenkins安装 首先安装jenkins,我们可以使用docker安装.用下面命令拉取jenkins镜像. docker pull jenkins/jenkins 然后正常安装jenkins容器即可 ...

  9. 复习精简版快速学vue3

    vue2中.如果给一个之前没有定义的属性赋值,会得不到时实更新: this.obj.b=2 //由于这个属性之前没有定义,是不支持动态响应,只能用this.$(this.obj,'b',2)也就是说v ...

  10. 摆脱鼠标操作 vscode-vim-use-readme.md

    vscode-vim 学习笔记 梳理下自己定义的快捷键 Normal模式返回 ESC capsLock 双击shift ctrl+[ jj ctrl+c (这个键比较特殊 用习惯y的话,考虑这个) 一 ...