RabbitMQ(七)——主题模式
RabbitMQ系列
RabbitMQ(七)——主题模式
前言
本章我们学习主题模式(Topic),主题模式与路由模式类似,不同的是路由模式生产者向指定路由发送消息,消费者接收指定路由的消息;主题模式生产者向交换机发送消息后,消费者可以对队列进行匹配,提供两个匹配字符,’ * ‘星号和 ‘ # ’井号,‘ * ’匹配一个词,‘ # ’ 匹配多个词,一般使用#号匹配多个,*号用的比较少。
解释:生产者P向topic交换机发送消息,向指定routekey发布消息,消费者通过绑定routekey匹配词接收消息。
如:生产者向routekey : topic.orange.rabbit 发送消息,消费者可通过绑定*.orange.* / *.*.rabbit接收到消息;
示例
生产者:
static void Main(string[] args)
{
Console.WriteLine("TopicServer发布服务器启动...");
//创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//创建连接和通道
using (var conn = factory.CreateConnection())
{
using (var channel = conn.CreateModel())
{
//创建topic类型交换机
channel.ExchangeDeclare("topicExchange", "topic"); string msg = "";
//模拟向不同路由发送消息
for (int i = 0; i < 40; i++)
{
msg = $"发布消息{i}";
var body = Encoding.UTF8.GetBytes(msg);
string Topic = "";
if (i % 2 == 0)
{
Topic = "Topic.add";
}
else
{
Topic = "Topic.remove";
}
channel.BasicPublish("topicExchange", Topic, null, body);
Console.WriteLine($"{Topic}-发布消息成功:{msg}"); Thread.Sleep(1000);
}
Console.ReadKey();
}
}
}
消费者1:
static void Main(string[] args)
{
Console.WriteLine("TopicClient接收客户端启动...");
//创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//创建连接和通道
using (var conn = factory.CreateConnection())
{
using (var channel = conn.CreateModel())
{
//创建队列
var queue = channel.QueueDeclare().QueueName;
//绑定交换机,指定匹配路由Topic.#
channel.QueueBind(queue, "topicExchange", "Topic.#");
//创建消费者 可接收topic路由下全部消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
//接收消息
var body = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"Topic.#接收消息:{body.ToString()}");
};
channel.BasicConsume(queue, true, consumer); Console.ReadKey();
}
}
}
消费者2:
static void Main(string[] args)
{
Console.WriteLine("TopicClient接收客户端启动...");
//创建连接工厂
var factory = new ConnectionFactory()
{
HostName = "127.0.0.1",
UserName = "guest",
Password = "guest"
};
//创建连接和通道
using (var conn = factory.CreateConnection())
{
using (var channel = conn.CreateModel())
{
//创建队列
var queue = channel.QueueDeclare().QueueName;
//绑定交换机 匹配路由Topic.add
channel.QueueBind(queue, "topicExchange", "Topic.add");
//创建消费者 只能接受到Topic.add路由消息
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
//接收消息
var body = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine($"Topic.add接收消息:{body.ToString()}");
};
channel.BasicConsume(queue, true, consumer); Console.ReadKey();
}
}
}
结果
理想的结果应该是生产者分别向Topic.add与Topic.remove路由发送消息,消费者1匹配路由Topic.# ,可以接收到Topic路由下所有消息,而消费者2匹配的是Topic.add路由,能接受到生产者发送给Topic.add路由的消息;
与上面猜测一致,消费者1能接收到生产者topic路由下的所有消息,消费者2能接收到topic.add路由下的消息,这与消费者交换机绑定的路由有关。
总结
- 主题模式(Topic)是最常用的模式,相较于路由模式(Direct)更灵活、更方便、更强大。
- 生产者模式需要在声明交换机时指定类型为Topic。
- 消费者接收消息有两种模糊查询:# 匹配一个或多个词,* 匹配一个词,# 使用较多
附上Demo源码:https://github.com/1164887865/RabbitMQDemo
RabbitMQ(七)——主题模式的更多相关文章
- Rabbitmq(6) 主题模式
* 匹配1个 # 匹配所有 发送者: package com.aynu.bootamqp.service; import com.aynu.bootamqp.commons.utils.Amqp; i ...
- RabbitMQ (七) 订阅者模式之主题模式 ( topic )
主题模式和路由模式很像 路由模式是精确匹配 主题模式是模糊匹配 依然先通过管理后台添加一个交换机. 生产者 public class Producer { private const string E ...
- RabbitMQ消息队列(八)-通过Topic主题模式分发消息(.Net Core版)
前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过routingkey来匹配消息的模式已经有一定了解那fanout也很好 ...
- (八)RabbitMQ消息队列-通过Topic主题模式分发消息
原文:(八)RabbitMQ消息队列-通过Topic主题模式分发消息 前两章我们讲了RabbitMQ的direct模式和fanout模式,本章介绍topic主题模式的应用.如果对direct模式下通过 ...
- RabbitMQ六种队列模式-主题模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主题模式 [ ...
- RabbitMQ 七种队列模式
(1)简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在 ...
- 队列模式&主题模式
# RabbitMQ 消息中间件 **Advanced Message Queuing Protocol (高级消息队列协议** The Advanced Message Queuing Protoc ...
- 【RabbitMQ】工作模式介绍
一.前言 之前,笔者写过< CentOS 7.2 安装 RabbitMQ> 这篇文章,今天整理一下 RabbitMQ 相关的笔记便于以后复习. 二.模式介绍 在 RabbitMQ 官网上提 ...
- RabbitMQ六种队列模式-简单队列模式
前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- RabbitMQ六种队列模式-工作队列模式
前言 RabbitMQ六种队列模式-简单队列RabbitMQ六种队列模式-工作队列 [本文]RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
随机推荐
- Springboot优雅读配置文件
转载自Springboot优雅读配置文件 很多时候我们需要将一些常用的配置信息比如阿里云oss配置.发送短信的相关信息配置等等放到配置文件中. 下面我们来看一下 Spring 为我们提供了哪些方式帮助 ...
- 【3分钟学会】一招禁用表单中input输入框回车键自动触发提交事件!
知其然知其所以然 在前端项目开发中,偶尔会有表单提交的问题: 用户输入表单后,不小心按了回车键,导致提前触发了提交事件? 问题概述 当表单中仅有一个input输入框时,按下回车键就会自动触发提交事件, ...
- 2024 盘古石数据取证 服务器部分wp
1. 分析内部IM服务器检材,在搭建的内部即时通讯平台中,客户端与服务器的通讯端口是:[答案格式:8888][★☆☆☆☆] 8065 2. 分析内部IM服务器检材,该内部IM平台使用的数据库版本是: ...
- C#向JAVA发送form-data文件问题处理方案
前言 和上一篇文章一样,.NET 和 JAVA之间的接口请求又遇到了新问题 我们有一个用来接收文件的接口,外部把文件流.文件名.目录,传进来,我们系统把生成的附件ID反回去,接口为POST-form- ...
- Linux清理内存,清理储存
因为工作中项目部署服务器后更新迭代或者服务器使用时间长后会出现内存/储存爆满,所以整合了一下,方便以后使用: 清理虚拟内存 查看内存 free -h 清理缓存 输入命令释放内存 0 – 不释放 1 – ...
- 《Visual Studio Code 权威指南》登上京东科技IT新书榜第一名!
自 6 月 30 日开启预售以来,<Visual Studio Code 权威指南>受到了许多读者朋友的青睐.感谢大家的支持! 仅仅三天时间,<Visual Studio Code ...
- Not all slots covered! Only 5461 slots are available. Set checkSlotsCoverage = false to avoid this check
Not all slots covered! Only 5461 slots are available. Set checkSlotsCoverage = false to avoid this c ...
- 龙哥量化:通达信(KT交易师)分时图主图叠加5分钟K线图
股友要求在通达信分时图主图叠加5分钟K线,但是通达信的分时图取不到最高价,最低价等数据,限制非常多. 然后我在KT交易师上写的公式测试成功了,效果如下. 如果您需要公式源码或者代写公式, 请联系我. ...
- Pelco-D控制协议
1. 通令参数: 标准速率为4800bps,无校验, 8位数据位,1位停止位 2.命令串格式: 一个PTZ控制命令为7字节的十六进制代码,格式如下: Word 1 Word2 Word 3 Wor ...
- 关于vue加element-ui上传文件获取文件的sha256的值 第二篇 更改压缩包编码错误
这个依然需要插件crypto-js 首先下载引入 import CryptoJs from "crypto-js"; 话不多说直接上代码,首先是element的上传 <el- ...