快速阅读

介绍exchange的topic类型,和Direct类型相似,但是增加了"."和"#"的匹配。比Direct类型灵活

Topic消息类型

特点是:topic消息类型不能是任意的routing key, 必须是有点"."组成的单词列表。

和dirct类似,最后也是也相应的key进行匹配

例如:speed.color.sepcies

注意可以用*号和#号出现,和我们日常用的正则表达式含义相近

"*"号代表任意一个单词

"#"号代表0个或多个单词

生产者代码

  1. 创建连接和信道
  2. 声明exchange类型
  3. 设置两个routingkey 各自发送两次。一共发送四条消息
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic"); var list = new List<string>();
list.Add("www.baidu.com");
list.Add("www.google.com");
for (var i = 0; i < 2; i++)
{
var routingKey = list[0];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true; channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body); Console.WriteLine(" [x] Sent {0},id={1}", message,i);
Thread.Sleep(1000);
} for (var i = 0; i < 2; i++)
{
var routingKey = list[1];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true; channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body); Console.WriteLine(" [x] Sent {0},id={1}", message, i);
Thread.Sleep(1000);
} } Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}

消费者代码

  1. 创建连接和信道
  2. 为了测试 topic 类型,限制输入中含 有baidu,google两个关键词和发送的routing key相匹配。
  3. 声明交换器类型
  4. 队列声明
  5. 把exchange和队列绑定到信道上
  6. 接受消息
static void Main(string[] args)
{
bool flag = true;
string level = "";
while (flag)
{
Console.WriteLine("请选择要查看的消息类型");
level = Console.ReadLine();
if (level.IndexOf(".baidu.")>0 || level.IndexOf(".google.") > 0 )
flag = false;
else
Console.Write("不支持你输入的消息");
} var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "topicType", routingKey: level);
//以下是区别生产者的
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, e) =>
{
var body = e.Body;
var message = Encoding.UTF8.GetString(body);
var rk = e.RoutingKey;
Console.WriteLine("Received {0},routingKey:{1}", message, rk);
Thread.Sleep(3000);//模拟耗时任务 ,
Console.WriteLine("Received over");
channel.BasicAck(deliveryTag: e.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
Console.WriteLine("");
Console.ReadLine();
} }

测试结果

我们启动消费者以后,输入四个routingkey去测试

分别是

.google.#, #.google. , *.google.com, *.baidu.com

分别监听中间是google 或者baidu的消息

结果符合要求

最新文章

  1. 实现一个基于 SharePoint 2013 的 Timecard 应用(下)
  2. [Asp.net 5] DependencyInjection项目代码分析3-Ninject
  3. hash-5.ConcurrentHashMap
  4. 数据库使用fmdb
  5. MyCat 学习笔记 第十篇.数据分片 之 ER分片
  6. BZOJ 1912 巡逻
  7. mysql 重命名表名
  8. Ubuntu 12.04如何从登录界面登录root
  9. 解决jQuery插件sliderjs, 点击插件分页,导航按钮后不能重新开始.
  10. swig模板 html代码自然状态下输出是转义的,必须加一个函数来转换为html代码;
  11. Oracle 11G DataGuard生产环境又一次启动具体过程
  12. Linux之通配符
  13. String类的源码分析
  14. Google 视频编码格式 VP9 究竟厉害在哪里
  15. react-native中的请求数据
  16. undefined reference to `vtable for MyColor&#39;
  17. redis 安装 ,sea 比较友好的一种
  18. GCC编译的几个步骤
  19. 第四次程序设计作业 C++计算器计算及命令行的使用 前缀表达式方法实现
  20. 第14章 UDP编程(3)_利用UDP实现广播功能

热门文章

  1. SQL SERVER-解析Extendevent文件数据
  2. 修改CentOS的YUM源
  3. Linux命令——watch
  4. MySQL事件自动kill运行时间超时的SQL
  5. 基于Java的支持可变QPS的http负载生成器,提供交互界面和RMI接口
  6. ffmpeg常用命令-学习
  7. 【转】java.io.Closeable接口
  8. 【转】解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)
  9. Vue移动组件库Mint UI的安装与使用
  10. Java 中的函数式接口