
.netcore3.1 RabbitMq Header交换机
标头交换机指在用于在多个属性上路由,这些属性比路由键更容易表示为消息标头。标头交换忽略路由键属性。相反,用于路由的属性取自headers
属性。如果标头的值等于绑定时指定的值,则认为消息匹配。
可以使用多个标题进行匹配,将队列绑定到标题交换。在这种情况下,代理需要从应用程序开发人员那里获得另一条信息,即,它是否应该考虑具有任何匹配的标头或全部匹配的消息?这就是x-match
绑定参数的作用。当x-match
参数设置为any
时,仅一个匹配的标头值就足够了。或者,将x-match
设置为all
要求所有值必须匹配。
其实这个玩意比较像我们在编程中的
and
与all
的关系,简单来看可以如下面这张图所示。
创建Header交换机与队列
注意这里的routingKey
其实并不起到任何作用所以这里我们可以将它设置为空,我们通过上图所示创建一个Header交换机,并先创建x-match:any
的队列myheaderQueue1
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 创建Header类型的交换机
channel.ExchangeDeclare(exchange: "MyHeaderExchange", ExchangeType.Headers, true, false);
// 声明一个队列
channel.QueueDeclare(
queue: "myheaderQueue1",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 绑定相关参数并将x-match设置为any
channel.QueueBind("myheaderQueue1", "MyHeaderExchange",string.Empty,new Dictionary<string, object> {
{ "x-match","any" },
{ "name","aidasi" },
{ "age","18" }
});
Console.WriteLine("myheaderQueue1 Created!");
}
}
随后我们再创建x-match:all
的myheaderQueue1
队列。
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
// 创建Header类型的交换机
channel.ExchangeDeclare(exchange: "MyHeaderExchange", ExchangeType.Headers, true, false);
// 声明一个队列
channel.QueueDeclare(
queue: "myheaderQueue2",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 绑定相关参数并将x-match设置为any
channel.QueueBind("myheaderQueue2", "MyHeaderExchange",string.Empty,new Dictionary<string, object> {
{ "x-match","all" },
{ "name","aidasi" },
{ "age","18" }
});
Console.WriteLine("myheaderQueue1 Created!");
}
}
运行并在UI
上查看绑定情况。
发布消息
发布3条消息。代码如下:
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob"
};
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
var properties = channel.CreateBasicProperties();
// 消息持久化
properties.Persistent = true;
// 实例化消息投
// 创建any的队列
properties.Headers = new Dictionary<string, object>()
{
{ "name","aidasi" },
{ "age","18" }
};
var msg = Encoding.UTF8.GetBytes("Message: name-aidasi,age-18");
channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg);
properties.Headers = new Dictionary<string, object>()
{
{ "name","aidasi" }
};
var msg1 = Encoding.UTF8.GetBytes("Message: name-aidasi");
channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg1);
properties.Headers = new Dictionary<string, object>()
{
{ "name","bob" },
{ "age","19" }
};
var msg2 = Encoding.UTF8.GetBytes("Message: name-bob,age-19");
channel.BasicPublish("MyHeaderExchange", string.Empty, properties, msg2);
}
}
在UI
中我们发现有相应的消息进入到了队列中
消费消息
代码如下:
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())
{
// 创建消费实例
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($" Queue:{EventQueueName} Message: {message}");
// 手动确认
channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: true);
};
// 绑定到队列中去
channel.BasicConsume(queue: queuename, autoAck: false, consumer: consumer);
Console.ReadLine();
}
}
我们找到程序生成后的目录,并运行两个Bash
到两个Header
队列中进行消费消息。
我们发现处理bob
那条消息没有消费外,其他的消息都对应了相应的or
与and
进行消费
欢迎加群讨论技术,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


欢迎加群交流技术