RabbitMQ 在 C# 中简单应用

RabbitMQ 在 C# 中简单应用

RabbitMQ是什么及如何安装就不再赘述,百度一下就知道了,只是在配置方面要多加注意。

话不多说,先直接上一个简示例代码

发送端:

ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
using (IConnection conn = factory.CreateConnection()){
    using (IModel im = conn.CreateModel()){
           im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct);
           im.QueueDeclare("rabbitmq_query", false, false, false, null);
           im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null);
           for (int i = 0; i < 1000; i++){
                byte[] message = Encoding.UTF8.GetBytes("Hello Lv");
                im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message);
                Console.WriteLine("send:" + i);
            }
     }
}

接收端:

ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
using (IConnection conn = factory.CreateConnection()){
	using (IModel im = conn.CreateModel()){
		while (true){
			BasicGetResult res = im.BasicGet("rabbitmq_query", true);
			if (res != null){
				Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body));
			}
		}
	}
}

发送端一次性发送一千条,发送过程很快,接收时相对要慢一些。

  

上述DEMO只限一个接收着,那相同的发送量,多个接收者会出现什么情况,添加一个新的接收端,直接复制DEMO中接收端即可。

 

附上运行结果:

  

可以看到,在两个接收端同时运行时,RabbitMQ 会按顺序的分发每个消息。当每个收到确认后,会将该消息删除,然后将下一个分发到下一个接收者,主要是因为RabbitMQ的循环分发机制。

上面简单说了一下,在多个接收者时,因为循环分发的原因,消息几乎是两个接收端对分的。

那么如何将相同的消息分发到多个接收端。

 对发送端代码进行修改:

ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
using (IConnection conn = factory.CreateConnection()){
	using (IModel im = conn.CreateModel()){
		im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由
		int i = 0;
		while (true){
			Thread.Sleep(1000);
			++i;
			byte[] message = Encoding.UTF8.GetBytes(i.ToString());
			im.BasicPublish("rabbitmq_route_Fanout", "", null, message);
			Console.WriteLine("send:" + i.ToString());
		}
	}
}

与上种方式比较,会发现在代码注释后面少两段代码,在设置了Fanout方式后,不需要再指定队列名称。停一秒是为了方便看结果,以免刷新太快。

 再来看看接收端代码:

ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
using (IConnection conn = factory.CreateConnection()){
	using (IModel im = conn.CreateModel()){
		im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);
		var queueOk = im.QueueDeclare();//1
		im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2
		var consumer = new QueueingBasicConsumer(im);//3
		im.BasicConsume(queueOk.QueueName, true, consumer);//4
		while (true){
            var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5
			var body = _result.Body;
			var message = Encoding.UTF8.GetString(body);
			Console.WriteLine("received:{0}", message);
		}
	}
}	

当一个新的接收端连接时(消费者),需要一个申报一个新的队列,注释1处代码,RabbitMQ在申报队列时,如果不指定名称会自动生成一个,这还是不错的。

 两个接收端时运行结果,符合预期。

  至于广播方式有什么不好之处,亲自运行下就知道了.

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值