您的位置:首页 > 其它

RabbitMQ 原文译04--路由

2016-04-11 11:10 183 查看
前一篇文章中我们构建了一个简单的日志系统,我们可以向多个接受者广播消息。

在这篇文章我,我们将要添加一些功能使得针对部分消息的接受成为可能,例如我们只对错误的消息进行磁盘记录,同时又可以把所有的消息打印到屏幕上。

绑定

在之前的案例中,我们已经创建了一个绑定,可以重新调用如下的代码:

channel.QueueBind(queue: queueName,exchange: "logs",routingKey: "");


绑定是交换机和队列之间的关系,可以简单的理解为队列对该交换机上的消息感兴趣。

绑定可以设定参数routingKey,为了避免和BasicPublish 方法的参数混淆,我们暂且称之为binding key,下面是我们创建一个带有指定binding key的绑定:

channel.QueueBind(queue: queueName,exchange: "direct_logs",routingKey: "black");


Direct exchange

我们之前的日志系统,把接受到的消息广播给所有的接受者,我们将要扩展它使得其能够根据消息的级别来过滤发送消息,例如我们想让记录日志的接受者仅仅接受严重性级别的错误消息,而不用在警告和信息级别的消息上浪费磁盘空间。

fanout没有办法提供给我们这样的灵活性,它只能对接受到的消息进行直接广播,而不去关心 routing key.

这里我们使用direct类型的交换机去代替,direct类型的交换机的实现思想非常简单--消息将会被发送到其Binding key 和消息的routing key 完全匹配的队列上。

为了说明这个问题,考虑下面的设定:

class ReceiveLogsDirect
{
public static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "direct_logs",
type: "direct");
var queueName = channel.QueueDeclare().QueueName;

if(args.Length < 1)
{
Console.Error.WriteLine("Usage: {0} [info] [warning] [error]",
Environment.GetCommandLineArgs()[0]);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
Environment.ExitCode = 1;
return;
}

foreach(var severity in args)
{
channel.QueueBind(queue: queueName,
exchange: "direct_logs",
routingKey: severity);
}

Console.WriteLine(" [*] Waiting for messages.");

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var routingKey = ea.RoutingKey;
Console.WriteLine(" [x] Received '{0}':'{1}'",
routingKey, message);
};
channel.BasicConsume(queue: queueName,
noAck: true,
consumer: consumer);

Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
}
}


View Code
编译执行代码:

例如:如果你仅仅想保存"warning"和"error"的消息,打开控制台输入:ReceiveLogsDirect.exe warning error

发送一个Error消息, 控制台输入 EmitLogDirect.exe error "Run. Run. Or it will explode."
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: