主题模式和路由模式很像

路由模式是精确匹配

主题模式是模糊匹配

依然先通过管理后台添加一个交换机.

生产者

    public class Producer
{ private const string ExchangeName = "test_exchange_topic"; public static void Send()
{
//获取一个连接
IConnection connection = ConnectionHelper.GetConnection(); //从连接中获取一个通道
IModel channel = connection.CreateModel(); //声明交换机
//channel.ExchangeDeclare(ExchangeName, "topic", false, false, null); //每次只向消费者发送一条消息,消费者使用后,手动确认后,才会发送另外一条
channel.BasicQos(, , false); string msg = "hello world "; //发送消息,只发送到路由键为"product.delete" 或者 "product.#"的队列.
//# 匹配一个或多个
//* 匹配一个
//上限为 255 个字节
channel.BasicPublish(ExchangeName, "product.delete", null, Encoding.Default.GetBytes(msg));
Console.WriteLine($"send {msg}"); channel.Close();
connection.Close();
}
}

消费者1

    public class Consumer1
{
private const string QueueName = "test_exchange1_queue";
private const string ExchangeName = "test_exchange_topic"; public static void Receive()
{
//获取连接
RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection(); //创建通道
RabbitMQ.Client.IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); //将队列绑定到交换机上
channel.QueueBind(QueueName, ExchangeName, "product.add", null);
channel.QueueBind(QueueName, ExchangeName, "product.update", null);
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string str = Encoding.Default.GetString(bytes);
Console.WriteLine("consumer1 : " + str);
channel.BasicAck(e.DeliveryTag, false);//手动应答
}; //监听队列
//bool autoAck = true;//自动确认,一旦mq将消息分发给了消费者,就会从内存中删除该消息
bool autoAck = false;//手动应答.
channel.BasicConsume(QueueName, autoAck, "", false, false, null, consumer);
}
}

消费者2

    public class Consumer2
{
private const string QueueName = "test_exchange2_queue";
private const string ExchangeName = "test_exchange_topic";
public static void Receive()
{
//获取连接
RabbitMQ.Client.IConnection connection = ConnectionHelper.GetConnection(); //创建通道
RabbitMQ.Client.IModel channel = connection.CreateModel(); //声明队列
channel.QueueDeclare(QueueName, false, false, false, null); //将队列绑定到交换机上
channel.QueueBind(QueueName, ExchangeName, "product.#", null); //添加消费者
EventingBasicConsumer consumer = new EventingBasicConsumer(channel); //注册事件
consumer.Received += (s, e) =>
{
byte[] bytes = e.Body;
string str = Encoding.Default.GetString(bytes);
Console.WriteLine(" consumer2 : " + str);
channel.BasicAck(e.DeliveryTag, false);//手动应答
}; //监听队列
//bool autoAck = true;//自动确认,一旦mq将消息分发给了消费者,就会从内存中删除该消息
bool autoAck = false;//手动应答.
channel.BasicConsume(QueueName, autoAck, "", false, false, null, consumer);
}
}

运行结果:

由于消费者1的路由键只有 "product.add" 和 "product.update" ,不包含"product.delete",

而消费者2的路由键是"product.#",可以模糊匹配上"product.delete",

所以交换机只会把消息转发到消费者2声明的队列中.

RabbitMQ (七) 订阅者模式之主题模式 ( topic )的更多相关文章

  1. activeMQ队列模式和主题模式的Java实现

    一.队列模式 生产者 import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destina ...

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

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

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

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

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

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

  5. RabbitMQ 七种队列模式

    (1)简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在 ...

  6. 【RabbitMQ】4、三种Exchange模式——订阅、路由、通配符模式

    前两篇博客介绍了两种队列模式,这篇博客介绍订阅.路由和通配符模式,之所以放在一起介绍,是因为这三种模式都是用了Exchange交换机,消息没有直接发送到队列,而是发送到了交换机,经过队列绑定交换机到达 ...

  7. demo rabbitmq topic(主题模式),fanout(广播模式),轮询分发,确认接收Ack处理

    //durable = true 代表持久化 交换机和队列都要为true ,持久代表服务重启,没有处理的消息依然存在 //topic 根据不同的routkey 发送和接收信息 //fanout 广播模 ...

  8. 队列模式&主题模式

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

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

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

随机推荐

  1. BZOJ1143 [CTSC2008]祭祀river 【二分图匹配】

    1143: [CTSC2008]祭祀river Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3236  Solved: 1651 [Submit] ...

  2. AOJ.559 丢失的数字

    丢失的数字 Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 1552 Submission Accepted: 273 Descri ...

  3. BZOJ_day???

    哇哈哈哈哈,这周能不能保持这个呢?

  4. taotao购物车2 解决购物车本地cookie和服务器redis不同步的问题

    下面的思路逻辑一定要理清楚,比较绕 思路; 前面已经实现了在cookie本地维护购物车的功能, 这次加入和服务器同步功能, 因为 购物车 操作比较频繁,所以,后台服务器 用redis存储用户的购物车信 ...

  5. noip 2011观光公交

    P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 风景迷人的小城Y 市,拥有n 个美 ...

  6. HLPP

    LOJ 最大流加强版 #include <bits/stdc++.h> const int inf=0x7fffffff; const int maxn=1210; const int m ...

  7. Spring 学习笔记(一)

    一.Spring 是什么? •Spring 是一个开源框架. •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. • ...

  8. All in One到”分布式“迁移过程中的坑

    为什么“分布式”要加引号? 与其他公司提高并发性能的场景可能不太一样,我们的系统之前是多个模块共用一个tomcat来运行的(All in One),模块有很多,光安装包就几十个.当某个模块或某几个模块 ...

  9. 【BZOJ】5028: 小Z的加油店

    [算法]数学+线段树/树状数组 [题解] 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd. 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数. 套路:g ...

  10. 【洛谷 SP283】NAPTIME - Naptime(DP)

    题目链接 先考虑如果只有一天,那么该怎么做. 设\(f[i][j][1]\)表示前\(i\)个小时睡了\(j\)个小时并且第\(j\)个小时正在睡觉时的最大体力,\(f[i][j][1]\)表示前\( ...