
.netcore3.1 RabbitMq Topics交换机
Topic Exchange介绍
发送到topic
交换机的消息不能具有任意的 routing_key
-它必须是单词列表,以点分隔。这些词可以是任何东西,但通常它们指定与消息相关的某些功能。一些有效的路由关键示例。一些有效的路由关键示例:stock.usd.nyse
,nyse.vmw
,quick.orange.rabbit
。路由关键字中可以包含任意多个单词,最多255个字节。
* (星号) | 可以代替一个单词。 |
# (哈希) | 可以替代零个或多个单词。 |
我们用一个简单的例子来做解释:
在此示例中,我们将发送所有描述地址的消息。将使用包含三个词(两个点)的路由密钥发送消息。路由键中的第一个单词将描述市名,第二个是区域名,第三个是地点名:<市名>.<区域名>.<地点名>
。
我们创建了三个绑定:匹配区域队列
与绑定键*.南岸区.*
绑定,匹配市名和地点队列
与*.*.弹子石
和重庆市.#
绑定。
大概我会列举几个消息然后会进入队列的消息如下所示:
Topic Exchange创建
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "MyTopicExchange", ExchangeType.Topic, true, false);
var routingKey = (args.Length > 0) ? args[0] : "重庆市.南岸区.弹子石";
var message = (args.Length > 1) ? string.Join(" ", args.Skip(1).ToArray()) : "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "MyTopicExchange", routingKey, properties, body);
Console.WriteLine(" [x] Sent '{0}':'{1}'", routingKey, message);
}
}
Topic 队列的创建与消费
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
Console.WriteLine("Please enter a queue name:");
// MyTopicExchange1 MyTopicExchange2
string queuename = Console.ReadLine();
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(queuename, ExchangeType.Topic, true, false);
// 声明一个队列
channel.QueueDeclare(
queue: queuename,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
foreach (var bindingKey in args)
{
// 绑定队列相关正则匹配
channel.QueueBind(queuename, "MyTopicExchange", bindingKey);
}
// 创建消费实例
var consumer = new EventingBasicConsumer(channel);
// 事件在交付到使用者时触发。(消费处理事件)
consumer.Received += (model, ea) =>
{
string EventQueueName = queuename;
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" RountingKey: {ea.RoutingKey} Queue:{EventQueueName} Message: {message}");
// 手动确认
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: true);
};
// 绑定到队列中去
channel.BasicConsume(queue: queuename, autoAck: false, consumer: consumer);
Console.ReadLine();
}
}
运行结果
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
633
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术