rabbitMQ工作流程:
1、声明交换机
2、声明消息队列
3、绑定交换机和队列
4、生产者往交换机里发送新消息
5、交换机根据所选的模式和routingKey决定消息发往哪条消息队列
6、一个消费者只能消费一条消息队列
(如果重复声明,类型参数不变不会报错。 如果第二次声明和第一次类型参数有变化,会报异常)
上代码:
1 var factory = new ConnectionFactory(); 2 factory.UserName = "guest"; 3 factory.Password = "guest"; 4 factory.HostName = "127.0.0.1"; //设置RabbitMQ服务器所在的IP或主机名 5 var connection = factory.CreateConnection(); 6 7 using (IModel channel = connection.CreateModel()) 8 { 9 //声明一个交换机 10 channel.ExchangeDeclare(exchange: "exchange1", 11 type: ExchangeType.Topic, 12 durable: true, 13 autoDelete: false, 14 arguments: null); 15 16 //声明三个消息队列 17 channel.QueueDeclare( 18 queue: "q1", 19 durable: true, 20 exclusive: false, 21 autoDelete: false, 22 arguments: null); 23 24 channel.QueueDeclare( 25 queue: "q2", 26 durable: true, 27 exclusive: false, 28 autoDelete: false, 29 arguments: null); 30 31 channel.QueueDeclare( 32 queue: "q3", 33 durable: true, 34 exclusive: false, 35 autoDelete: false, 36 arguments: null); 37 38 //用不同的routingKey绑定队列与交换机 39 channel.QueueBind(queue: "q1", 40 exchange: "exchange1", 41 routingKey: "person.name.*", 42 arguments: null); 43 44 channel.QueueBind(queue: "q2", 45 exchange: "exchange1", 46 routingKey: "person.age.*", 47 arguments: null); 48 49 channel.QueueBind(queue: "q3", 50 exchange: "exchange1", 51 routingKey: "person.#", 52 arguments: null); 53 54 55 //往交换机中发出一条消息 56 channel.BasicPublish( 57 exchange: "exchange1", 58 routingKey: "person.name.jerry", 59 basicProperties: null, 60 body: Encoding.UTF8.GetBytes(msg));
三种常用路由模式:
1、Direct
这种模式下,交换机根据routingKey进行完全匹配。如果匹配失败则丢弃消息。
例如:绑定的交换机routingKey是"person.name",而使用BasicPublish()方法往交换机发消息时用的"person.name"则匹配成功,将根据交换机名称和routingKey找到绑定的消息队列,并发送新消息。
2、Fanout
这种模式会完全忽略routingKey。
只要往交换机1中发送消息,则会广播到与交换机1绑定的所有消息队列。
3、Topic
这种模式下可以对routingKey进行模糊匹配,如果匹配失败则丢弃消息,如果匹配多个结果,则往多个结果都发送消息。
类似于正则表达式, 它有两种语法:“*”,"#"
"*"只匹配当前级别的词,如"person.*"可以匹配"person.name",无法匹配"person.name.jerry"。无法匹配空,如"person"。
"#"能匹配多个子级别的词,如"person.#"可以匹配"person.name",也可以匹配"person.name.jerry"。可以匹配空,如"person"。