
.netcore3.1 RabbitMq Fanout交换机
在前面我们有提到交换机但都是用的普通的交换机(direct
),交换机在Rabbitmq
中有4
种可用类型:direct
,topic
,headers
和fanout
。而今天我要讲的是最后一个fanout
交换机,它的作用可以用下面的一张图来说明。
如果你们公司要发新年的祝福语,一般会通过手机发短信给你发一条,然后邮件给你发一条,系统里面也可能会给你发一条。所以这就是fanout
交换机的好处,都是同一条消息不同的队列处理相同的消息。
创建相关队列(手机与邮箱)
代码
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("MyFanoutExchangeName", ExchangeType.Fanout,true,false);
// 声明一个队列
channel.QueueDeclare(
queue: "MyFanoutPhone",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 声明一个队列
channel.QueueDeclare(
queue: "MyFanoutEmail",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 将队列与交换机绑定在一起
channel.QueueBind("MyFanoutPhone", "MyFanoutExchangeName", string.Empty, null);
channel.QueueBind("MyFanoutEmail", "MyFanoutExchangeName", string.Empty, null);
Console.WriteLine("Finish");
Console.ReadLine();
}
}
运行图片
创建2种消费端(手机和邮箱)
创建消费端
var factory = new ConnectionFactory()
{
HostName = "47.98.187.188",
UserName = "bob",
Password = "bob",
VirtualHost = "/"
};
// 获取要取消息的队列的名称
var QueueName = args[0];
Console.WriteLine($"Queue Name: {QueueName}");
// 创建一个链接
using (var connection = factory.CreateConnection())
{
// 创建一个通道
using (var channel = connection.CreateModel())
{
// one by one 处理
channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
// 创建消费实例
var consumer = new EventingBasicConsumer(channel);
// 事件在交付到使用者时触发。(消费处理事件)
consumer.Received += (model, ea) =>
{
try
{
string _QueueName = QueueName;
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Thread.Sleep(1000);
if (QueueName == "MyFanoutPhone")
{
Console.BackgroundColor = ConsoleColor.Blue; //设置背景色
Console.ForegroundColor = ConsoleColor.White; //设置前景色,即字体颜色
Console.WriteLine("From MyFanoutPhone Message: {0}", message);
// 否定确认,减少网络请求,提高性能
channel.BasicAck(ea.DeliveryTag,multiple: true);
}
else
{
Console.BackgroundColor = ConsoleColor.Green;
Console.ForegroundColor = ConsoleColor.DarkGreen;
Console.WriteLine("From MyFanoutEmail Message: {0}", message);
// 重新排队,减少网络请求,提高性能
channel.BasicAck(ea.DeliveryTag, multiple: true);
}
}
catch (Exception ex)
{
Console.WriteLine("【Error】:", ex.Message);
channel.BasicNack(ea.DeliveryTag, multiple: true, requeue: true);
}
};
// 绑定到队列中去
channel.BasicConsume(queue: QueueName, autoAck: false, consumer: consumer);
Console.ReadLine();
}
}
运行消费端
我们这里通过输入不同的参数去不同的队列中处理相同的消息。(开启两个窗体分别处理手机与邮箱)
./Worker.exe MyFanoutPhone
./Worker.exe MyFanoutEmail
添加消息
在创建队列的时候添加相关消息。
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("MyFanoutExchangeName", ExchangeType.Fanout,true,false);
// 声明一个队列
channel.QueueDeclare(
queue: "MyFanoutPhone",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 声明一个队列
channel.QueueDeclare(
queue: "MyFanoutEmail",
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
// 将队列与交换机绑定在一起
channel.QueueBind("MyFanoutPhone", "MyFanoutExchangeName", string.Empty, null);
channel.QueueBind("MyFanoutEmail", "MyFanoutExchangeName", string.Empty, null);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(
exchange: "MyFanoutExchangeName",
routingKey: string.Empty,
basicProperties: properties,
body: Encoding.UTF8.GetBytes("Happy New Year")
);
Console.WriteLine("Finish");
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


欢迎加群交流技术