RabbitMQ 消息队列 入门 第二章(交换类型fanout)

时间:2023-03-09 19:12:32
RabbitMQ 消息队列 入门 第二章(交换类型fanout)

1.安装完 RabbitMQ 之后,我们可以点击  http://localhost:15672/#/  默认账号:guest  密码: guest 

  在这上面我们可以查看执行情况、管理连接、管理队列、管理通道、管理Exchange(交换所)

RabbitMQ 消息队列 入门 第二章(交换类型fanout)

2.交换类型

  交换类型分为:direct、topic、headers 、 fanout 四种,这一章我们先学习 fanout ,

fanout:大致如下图(类似广播),P是生产者,X是Exchange  ,P把消息发给 X 然后X会下发给所有与它关联的队列排队执行

RabbitMQ 消息队列 入门 第二章(交换类型fanout)

2.例子

  下面我用一个订阅者跟发布者来给大家做一个例子

首先我们先创建一个发布者:

/// <summary>
/// 发布者
/// </summary>
public static void RabbitPublishedHost()
{
ConnectionFactory factory = new ConnectionFactory()
{
HostName = "localhost",
Port = 5672
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "message",
type: "fanout");//注意这里填写的交换类型
while (true)
{
Console.WriteLine("请输入要发布的消息 [enter] 发送:");
var message = Console.ReadLine();
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "message",
routingKey: "",
basicProperties: null,
body: body);
Console.WriteLine(string.Format("{0} 发布了消息:{1}", DateTime.Now.ToShortDateString(), message));
}
}
}
} //控制台运行
static void Main(string[] args)
{
RabbitMQTest.RabbitPublishedHost();
}

  这里是订阅者代码:

/// <summary>
/// 订阅者
/// </summary>
public static void RabbitSubscribeClient()
{
ConnectionFactory factory = new ConnectionFactory()
{
HostName="localhost",
Port =5672
};
try
{
using (IConnection connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "message", type: "fanout"); var queueName = channel.QueueDeclare().QueueName; channel.QueueBind(queue: queueName,
exchange: "message",
routingKey: ""); var consumer = new EventingBasicConsumer(channel); consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body); Console.WriteLine(string.Format("收到推送的消息:{0}", message));
}; channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);
Console.ReadLine();
}
}
}catch(Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}
//控制台运行 static void Main(string[] args)
{
RabbitMQTest.RabbitSubscribeClient();
}

  

当我们同时运行多个项目(可到bin 目录下点击运行多个消费者窗口)结果如图:

RabbitMQ 消息队列 入门 第二章(交换类型fanout)