首页 > 其他分享 >RabbitMQ入门学习系列(六) Exchange的Topic类型

RabbitMQ入门学习系列(六) Exchange的Topic类型

时间:2022-11-25 17:08:49浏览次数:54  
标签:body Console routingKey Exchange RabbitMQ Topic var message channel


快速阅读

介绍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的消息

结果符合要求

RabbitMQ入门学习系列(六) Exchange的Topic类型_正则表达式


标签:body,Console,routingKey,Exchange,RabbitMQ,Topic,var,message,channel
From: https://blog.51cto.com/u_15834343/5887036

相关文章

  • RabbitMQ入门学习系列(五) Exchange的Direct类型
    快速阅读利用Exchange的Direct类型,实现对队列的过滤,消费者启动以后,输入相应的key值,攻取该key值对应的在队列中的消息。从一节知道Exchange有四种类型前面我们说了fanout......
  • RabbitMQ入门学习系列(四) 发布订阅模式
    什么时发布订阅模式把消息发送给多个订阅者。也就是有多个消费端都完整的接收生产者的消息换句话说把消息广播给多个消费者消息模型的核心RabbitMQ不发送消息给队列,生产者......
  • RabbitMQ简介
            RabbitMQ是一种消息队列,用于常见的进程通信。支持点对点,请求应答和发布订阅模式并且提供多种语言的支持。常见的java,c#,php都支持。常被用在异步处理,应用......
  • RabbitMQ入门学习系列(二),单生产者消费者
    友情提示我对我的文章负责,发现好多网上的文章没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题。可以直接在公众号《爱码农爱生活》......
  • centos7安装rabbitmq3.9.16
    下载erlangwget--content-disposition--no-check-certificatehttps://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.......
  • rabbitMQ的高级部分
    RabbitMQ的高级特性消息的可靠投递:指的是由消息生产者发动到RabbitMQ中间件,这个过程是必须成功的。在使用RabbitMQ的时候,作为消息发送方希望杜绝任何消息丢失或者投递失败的......
  • RabbitMQ中间件
    RabbitMQ导入依赖<!--集成RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></de......
  • RabbitMQ笔记
    RabbitMQ笔记个人学习笔记记录参考:尚硅谷1.消息队列2.轮训分发消息3.消息应答4.发布确认5.交换机5.1Exchanges5.1.1Exchanges概念RabbitMQ消息传递模型的核心......
  • Spring Boot 整合 RabbitMQ 之 Fanout Exchange模式 (三)
    摘要:那前面已经介绍过了Direct模式(一)Topic转发模式(二),这次介绍下FanoutExchange形式又叫广播形式,因此我们发送到路由器的消息会使得绑定到该路由器的每一个Queue接收......
  • Spring Boot 整合 RabbitMQ 之 Topic转发模式 (二)
    摘要:上一篇介绍了Direct模式的消息发生机制,这篇介绍下Topic转发模式的消息发生机制。一:首先我们看发送端,我们需要配置队列Queue,再配置交换机(Exchange),再把队列按照相应......