(三):rabbitmq生产者分析
所谓生产正,就是主动推送消息的那一方,rabbitmq可以实现后端和后端的消息的主动推送,根据路由规则,将信息发送到某些指定的队列
1:rabbit的路由规则常用的有3种:
(1)Direct(直接交换模式,routingKey必须完全相等才能匹配)
消费者一个交换机可以绑定多个队列,生产者根据消费者的交换机名称,routingKey做完全匹配(一对一的发送信息)
(2)Topic(主题模式,routingKey根据通配符*,#去匹配)
消费者一个交换机可以绑定多个队列,但是最终匹配时生产者是根据消费者的交换机名称,routingKey(通配符)去匹配得
(生产者查找时的routingKey)agreements.eu.berlin.* (消费者的routingKey)agreements.eu.berlin (不能匹配, *必须要有一个,这里没有了)
(生产者查找时的routingKey)*.log (消费者的routingKey)error.log(能匹配)
(生产者查找时的routingKey)agreements.eu.berlin.* (消费者的routingKey)agreements.eu.berlin.nn(能匹配, *有一个字符串代替, 而且只有一个字符代串替*,所以能匹配)
(生产者查找时的routingKey)agreements.eu.berlin.* (消费者的routingKey) agreements.eu.berlin.nn.xx(不能匹配,只能有一个代替 * 得字符串,这里得.nn.xx是两个字符串了)
(生产者查找时的routingKey)agreements.eu.berlin.# (消费者的routingKey)agreements.eu.berlin (能匹配, #号可以没有字符串代替)
(生产者查找时的routingKey)#.log (消费者的routingKey)ttt.error.log(能匹配,#能替代以多个点隔开的字符串)
(生产者查找时的routingKey)xx.yy.# (消费者的routingKey)xx.yy.tt.ff(能匹配)
(生产者查找时的routingKey)#.log (消费者的routingKey)log(能匹配,#号可以不用字符串代替)
(生产者查找时的routingKey)agreements.eu.berlin.# (消费者的routingKey)agreements.eu.berlin.nn.xx (能匹配, #号可以有一个或者多个字符串代替)
(3)fanout(广播模式)
生产者不需要指定routingKey,生产者直接根据消费者的路由名称,推送到该路由下面的所有队列
消费者一个交换机可以绑定多个队列,一个队列也可以绑定多个交换机
2:实现代码
在项目引用nuget里面下载RabbitMQ.Client
//创建一个链接
private static readonly ConnectionFactory factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "guest",
Password = "guest1",
Port = 5679,
};
private static void DirectExchangeSendMsg()
{
//创建一个新的,持久的交换区
IConnection connection = factory.CreateConnection();
IModel channel = connection.CreateModel();
//推送的消息
var message = "tsdxx";
var body1 = Encoding.UTF8.GetBytes(message);
//将消息模式设置为持久或者或者非持久模式
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
//根据消费者的路由和routingKey进行消息发送
channel.BasicPublish(exchange: "Jent.Exchange1", routingKey: "cusumer_key1", basicProperties: properties, body: body1);
}