Topic exchange

topic与之前的每个类型都不同(ps:废话每个都是不同的)。Topic解决了我们另一个需求。举个例子,有一个做资讯的公司,他们会收集各种科技公司的动态并且第一时间转发出来。小编A负责微软公司,小编B负责谷歌公司,手工去搜索文章并且看标题是否匹配再进行转发是非常的低效的,可能小编们想要偷懒,写一个程序去各大网站进行爬数据,对于标题中含有微软的交给小编A,对于标题中含有谷歌的交给小编B。

是的,topic就是类似与正则进行模糊匹配routingkey,对于key需求是即确定又不完全确定的。

*代表零到多个字符

. 代表一个字符

把这个嵌套到代码中,先看生产者部分代码,现在发布不再是写死的,可以在控制台程序中输入的。

            var flag = true;
while (flag)
{ Console.WriteLine("请输入要发布的消息 key|msg。 或者按Ctrl+ C退出"); var msg = Console.ReadLine(); //创建返回一个新的频道
using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{ var msgs = msg.Split('|'); //发布一个消息
var body = Encoding.UTF8.GetBytes(msgs[1]); channel.BasicPublish("TopicExchange", routingKey: msgs[0], basicProperties: null, body: body); Console.Write("发布成功!"); }
}

再把注意力转到consumer端,可以指定路由规则。声明了一个topic类型的exchange进行绑定。然后进行消费

            bool flag = true;
var key = "";
while (flag)
{
Console.WriteLine("请输入路由正则 .代表一个字符 *代表零到多个字符");
key = Console.ReadLine();
if (string.IsNullOrWhiteSpace(key))
{
Console.Write("请输入路由");
continue;
}
else
flag = false; } using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{
//根据声明使用的队列
var QueueName = key + "Queue"; //声明交换机 headers模式
channel.ExchangeDeclare("TopicExchange", ExchangeType.Topic, true, false); channel.QueueDeclare(QueueName, true, false, false, null);
//进行绑定
channel.QueueBind(QueueName, "TopicExchange", key, null); //创建consumbers
var consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine($"{e.RoutingKey}:{msg}");
}; //进行消费
channel.BasicConsume(QueueName, true, consumer); Console.ReadKey(); }

现在,让我们把程序跑起来,并指定了 *微软*与*谷歌*的路由

再发布几条匹配的消息

RabbitMQ Topic exchange的更多相关文章

  1. RabbitMQ入门:主题路由器(Topic Exchange)

    上一篇博文中,我们使用direct exchange 代替了fanout exchange,这次我们来看下topic exchange. 一.Topic Exchange介绍 topic exchan ...

  2. PHP 下基于 php-amqp 扩展的 RabbitMQ 简单用例 (二) -- Topic Exchange 和 Fanout Exchange

    Topic Exchange 此模式下交换机,在推送消息时, 会根据消息的主题词和队列的主题词决定将消息推送到哪个队列. 交换机只会为 Queue 分发符合其指定的主题的消息. 向交换机发送消息时,消 ...

  3. RabbitMQ指南之五:主题交换器(Topic Exchange)

    在上一章中,我们完善了我们的日志系统,用direct交换器替换了fanout交换器,使得我们可以有选择性地接收消息.尽管如此,仍然还有限制:不能基于多个标准进行路由.在我们的日志系统中,我们可能不仅希 ...

  4. RabbitMQ学习之:(八)Topic Exchange (转贴+我的评论)

    From: http://lostechies.com/derekgreer/2012/05/18/rabbitmq-for-windows-topic-exchanges/ RabbitMQ for ...

  5. springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别

    这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...

  6. RabbitMQ中 exchange、route、queue的关系

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心,下面我们就围绕这三个主要组件    从应用使用的角度全面的介绍如何利用Rabbit MQ构建 ...

  7. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...

  8. RabbitMQ(三): exchange 的使用

    1. Exchange(交换机) 生产者只能发送信息到交换机,交换机接收到生产者的信息,然后按照规则把它推送到对列中. 一方面是接收生产者的消息,另一方面是像队列推送消息. 匿名转发 "&q ...

  9. Rabbitmq交换器Exchange和消息队列

    通常我们谈到队列服务, 会有三个概念: 发消息者.队列.收消息者,RabbitMQ 在这个基本概念之上, 多做了一层抽象, 在发消息者和 队列之间, 加入了交换器 (Exchange). 这样发消息者 ...

随机推荐

  1. mysql 5.5.32 多实例环境的启动问题

      [root@localhost scripts]# /bin/sh mysql_install_db --user=mysql --dasedir=/application/mysql --dat ...

  2. CentOS7minimal MySql的卸载及安装

    因为CentOS7精简版默认是有残留的MySql的,所以开始时一定要先卸载掉原来的MySql 首先要使用root用户登录 卸载: 1.卸载原有程序 yum remove mysql mysql-ser ...

  3. Python单例模式

    1.单例模式介绍 单例模式,也叫单子模式,是一种常用的软件设计模式.在应用这个模式时, 单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个 全局对象,这样有利于我们协调系统整体的行为 ...

  4. java的输入输出及相关快捷键

    首先:导入包import java.util.Scanner; 然后:在主函数中创建对象,eg:Scanner input=new Scanner(System.in);​ 最后,如果要输入字符串,则 ...

  5. 2-2 Linux 根文件系统详解

    根据马哥Linux初级视频2-3 1. 根文件下的一级目录 #ls / 1. / boot 系统启动相关的文件.如内核.initrd   (initialization run directory) ...

  6. Chrome

    一.简介 二.安装 1)离线版 http://www.google.cn/chrome/browser/thankyou.html?statcb=1&platform=win64&st ...

  7. 烂泥:openvpn配置文件详解

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 在上一篇文章<烂泥:ubuntu 14.04搭建OpenVPN服务器>中,我们主要讲解了openvpn的搭建与使用,这篇文章我们来详细介绍下有 ...

  8. 传输层协议TCP和UDP

    本文力图简洁,让读者对TCP和UDP有个初步的认知.闲话少说,现在开始吧.TCP和UDP都是传输层的协议.TCP通过三次握手建立可靠连接,对未送达的消息重新进行发送.UDP不建立连接而直接发送,对未送 ...

  9. 虚拟机linux上网问题

    VMware中虚拟机网络的三种设置 1.桥接(bridged)(设置上网比较繁琐,但是在嵌入式开发中比较有用)2.NAT(上网比较简单,但是不能用于嵌入式开发中)3.Host only (该模式下仅主 ...

  10. Python 数据类型及其用法

    本文总结一下Python中用到的各种数据类型,以及如何使用可以使得我们的代码变得简洁. 基本结构 我们首先要看的是几乎任何语言都具有的数据类型,包括字符串.整型.浮点型以及布尔类型.这些基本数据类型组 ...