我正在用RabbitMQ做一个项目。我的代码如下。
生产者。
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("hello", false, false, false, null);
string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "hello", null, body);
Console.WriteLine(" [x] Sent {0}", message);
}
}
}
已声明Exchange的消费者:
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("hello", "direct",false, false, false, null);
channel.QueueDeclare("hello", false, false, false, null);
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("hello", true, consumer);
Console.WriteLine(" [*] Waiting for messages." +
"To exit press CTRL+C");
while (true)
{
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
}
}
未声明Exchange的消费者
public static void Main()
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("hello", false, false, false, null);
var consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume("hello", true, consumer);
Console.WriteLine(" [*] Waiting for messages." +
"To exit press CTRL+C");
while (true)
{
var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine(" [x] Received {0}", message);
}
}
}
这两段消费者代码都能很好的工作,那么声明交换的主要用途是什么呢?我很困惑。谁能说明一下?
发布到 队列 让你只可以实现基本的发布-订阅场景,其中生产者和消费者使用确切的队列。在多个消费者的情况下,一个单一的消息队列会在多个消费者之间分配。
发布到 交换 让你创建复杂的场景,因为 路由 交易所和队列之间。
例如,一个 兑换 将消息路由到所有绑定队列。这样,你可以有一个生产者和多个消费者,而且每个消息都是 抄袭 到所有绑定的队列,并独立接收。
另一个交换的例子,一个 话锋一转 将消息路由到绑定队列,基于 路由键 和队列中的模式。这就引入了一种有趣的可能性,即 标识 消息,并有条件地传递它们。
完整的交换类型和它们的简介请参考文档。