RabbitMQ消息队列(五):Routing 消息路由[转]
2015-01-06 12:21
429 查看
上篇文章中,我们构建了一个简单的日志系统。接下来,我们将丰富它:能够使用不同的severity(严重程度)来监听不同等级的log。比如我们希望只有error的log才保存到磁盘上。
[b]绑定[/b]其实就是关联了exchange和queue。或者这么说:queue对exchange的内容感兴趣,exchange要把它的Message deliver(提供)到queue中。
实际上,绑定可以带routing key这个参数,空字符串也是一个routing key的名字。其实这个参数的名称和basic_publish的参数名是相同了。第二篇有介绍当exchange的名称为空字符串的时候,创建queue的时候用到queue的名字和Producer的BasicPublish方法或Consuner的BasicConsume方法的routing key的名字可以是相同的。即queue的名字和routing key的名字是相同的。
[b]为了避免混淆,我们把这个routing key称为binding key(即在Exchange中的routing key)[/b]
使用一个binding key来创建binding :
上一篇文章我们讲的是使用fanout类型的exchange,对于fanout的exchange来说,这个参数是被忽略的。
Consumer.cs
必须先运行Consumer,然后在运行Producer.
转: http://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html(官网) http://blog.csdn.net/anzhsoft/article/details/19630147(翻译)
1. Bindings绑定
上篇文章中我们是这么做的绑定:channel.QueueBind(queueName, EXCHANGE_NAME, ROUTING_KEY);//const string ROUTING_KEY = "";
[b]绑定[/b]其实就是关联了exchange和queue。或者这么说:queue对exchange的内容感兴趣,exchange要把它的Message deliver(提供)到queue中。
实际上,绑定可以带routing key这个参数,空字符串也是一个routing key的名字。其实这个参数的名称和basic_publish的参数名是相同了。第二篇有介绍当exchange的名称为空字符串的时候,创建queue的时候用到queue的名字和Producer的BasicPublish方法或Consuner的BasicConsume方法的routing key的名字可以是相同的。即queue的名字和routing key的名字是相同的。
[b]为了避免混淆,我们把这个routing key称为binding key(即在Exchange中的routing key)[/b]
使用一个binding key来创建binding :
channel.QueueBind(queueName, EXCHANGE_NAME, routingKey);//string routingKey = "指定RoutingKey的名称";
上一篇文章我们讲的是使用fanout类型的exchange,对于fanout的exchange来说,这个参数是被忽略的。
2. Direct exchange
Direct exchange的路由算法非常简单:通过binding key的[b]完全匹配[/b],可以通过下图来说明。/// <summary> /// 多个routing key指定同一个queue /// 接收端创建临时queue /// </summary> /// <param name="args"> /// ReceiveDemo5.exe direct_custom_routing_key_hello1 /// ReceiveDemo5.exe direct_custom_routing_key_hello2 /// </param> static void Main(string[] args) { if (args.Length < 1) { Console.Error.WriteLine("请指定一个新的Routing Key名称", Environment.GetCommandLineArgs()[0]); Environment.ExitCode = 1; return; } var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { const string EXCHANGE_NAME = "direct_logs"; channel.ExchangeDeclare(EXCHANGE_NAME, "direct");//接收端如果关闭之后,自动创建的Queue会自动被删除 string queueName = channel.QueueDeclare();//获取临时创建的Queue的名称 foreach (var routingKey in args) { channel.QueueBind(queueName, EXCHANGE_NAME, routingKey); } Console.WriteLine(" [*] Waiting for messages. " + "To exit press CTRL+C"); var consumer = new QueueingBasicConsumer(channel); channel.BasicConsume(queueName, true, consumer); while (true) { var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); var body = ea.Body; var message = Encoding.UTF8.GetString(body); var routingKey = ea.RoutingKey; Console.WriteLine(" [x] Received '{0}':'{1}'", routingKey, message); } } } }
Consumer.cs
必须先运行Consumer,然后在运行Producer.
转: http://www.rabbitmq.com/tutorials/tutorial-four-dotnet.html(官网) http://blog.csdn.net/anzhsoft/article/details/19630147(翻译)
相关文章推荐
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由[转]
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ (消息队列)专题学习05 routing(路由)
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由(转)
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- (转)RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由
- RabbitMQ消息队列(五):Routing 消息路由[转]
- RabbitMQ消息队列(五):Routing 消息路由 2[原]
- rabbitmq消息队列——"路由"
- 柯南君:看大数据时代下的IT架构(7)消息队列之RabbitMQ--案例(routing 起航)