rabbitmq之交换机fanout(c#)
fanout的主要功能是广播,他会将他收到的消息广播到它已知的所有队列当中
这个特性我们可以适用于群发的情况,像官方例子当中的简单日志广播,也可以用于接受数据源(如硬件采集到的数据)提供的数据,将其转发给数据库用于保存,转发给程序用于显示等等
其过程如下
publish的实现代码如下
var factory = new ConnectionFactory();
{
factory.HostName = "localhost";
factory.UserName = "guest";
factory.Password = "guest";
}
//从连接工程中打开一个连接
using (var connection = factory.CreateConnection())
//创建一个channel
using (var channel = connection.CreateModel())
{
//声明交换机
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
var message = "hello rabbit";
//将string类型的消息转化为bytes
var body = Encoding.UTF8.GetBytes(message);
for (int i = 0; i < 20; i++)
{
//发布
//参数说明,交换机类型,routekey,是否持久化,消息
channel.BasicPublish(exchange: "logs",
routingKey: "",
basicProperties: null,
body: body);
Console.WriteLine("已发送"+message);
Thread.Sleep(600);
}
}
consumer实现如下
using (var channel = connection.CreateModel())
{
//同样要声明交换机的类型及名称,不然publish和consumer匹配不上
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
//声明一个队列,这个队列的名称随机
var queueName = channel.QueueDeclare().QueueName;
//将这个队列绑定(bind)到交换机上面
channel.QueueBind(queue: queueName,
exchange: "logs",
routingKey: "");
//声明一个consumer
var consumer = new EventingBasicConsumer(channel);
//一个委托,只要这个程序不被杀死,这段代码便一直监听rabbitmq,有消息就实时收到
consumer.Received += (model, ea) =>
{
//处理收到的数据并打印
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(message);
};
channel.BasicConsume(queue: queueName,
noAck: true,
consumer: consumer);
Console.ReadLine();