C# RabbitMq使用演示
1.创建一个队列消费者类QueueConsumer.cs
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简单RabbitMQ使用
{
public class QueueConsumer : EventingBasicConsumer
{
public QueueConsumer(IModel model)
: base(model)
{
}
private ConcurrentQueue<BasicDeliverEventArgs> shareQueue = new ConcurrentQueue<BasicDeliverEventArgs>();
/// <summary>
/// Overrides <see cref="DefaultBasicConsumer"/>'s <see cref="HandleBasicDeliver"/> implementation,
/// building a <see cref="BasicDeliverEventArgs"/> instance and placing it in the Queue.
/// </summary>
public override void HandleBasicDeliver(string consumerTag,
ulong deliveryTag,
bool redelivered,
string exchange,
string routingKey,
IBasicProperties properties,
byte[] body)
{
var eventArgs = new BasicDeliverEventArgs
{
ConsumerTag = consumerTag,
DeliveryTag = deliveryTag,
Redelivered = redelivered,
Exchange = exchange,
RoutingKey = routingKey,
BasicProperties = properties,
Body = body
};
lock (shareQueue)
{
shareQueue.Enqueue(eventArgs);
}
}
public BasicDeliverEventArgs ReceiveTimeOut()
{
BasicDeliverEventArgs message = null;
shareQueue.TryDequeue(out message);
return message;
}
}
}
2.创建生产者
using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简单RabbitMQ使用
{
public class 生产者
{
public void DoWork()
{
var factory = new ConnectionFactory();//
//factory.HostName = "localhost";
factory.HostName = "192.168.2.111";//主机名(RabbitMQ 服务器地址),Rabbit会拿这个IP生成一个endpoint,这个很熟悉吧,就是socket绑定的那个终结点。
factory.UserName = "rabbitmq";//默认用户名,用户可以在服务端自定义创建,有相关命令行
factory.Password = "rabbitmq";//默认密码
using (var connection = factory.CreateConnection())//连接服务器,即正在创建终结点。
{
//创建一个通道,这个就是Rabbit自己定义的规则了,如果自己写消息队列,这个就可以开脑洞设计了
//这里Rabbit的玩法就是一个通道channel下包含多个队列Queue
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("myDate.test", "fanout");//创建交换
// 创建多个队列,并将队列绑定到同一个交换;
for (int i = 1; i < 2; i++)
{
string queueName = string.Format("myDate.test.Queue{0}", i.ToString());
channel.QueueDeclare(queueName, true, false, false, null);//创建队列
channel.QueueBind(queueName, "myDate.test", "myDate.test");//绑定交换与队列
}
// channel.QueueDeclare("myDate.test.Queue1", true, false, false, null);//创建队列
//channel.QueueBind("myDate.test.Queue1", "myDate.test", "myDate.test");//绑定交换与队列
for (int i = 0; i < 1000000; i++)
{
string message = "I am Kiba518"; //传递的消息内容
//数据写入交换,写入与队列无关;
channel.BasicPublish("myDate.test", "myDate.test", null, Encoding.UTF8.GetBytes(message)); //生产消息
}
//channel.QueueDeclare("kibaQueue", false, false, false, null);//创建一个名称为kibaqueue的消息队列
//var properties = channel.CreateBasicProperties();
//properties.DeliveryMode = 1;
//string message = "I am Kiba518"; //传递的消息内容
//channel.BasicPublish("", "kibaQueue", properties, Encoding.UTF8.GetBytes(message)); //生产消息
//Console.WriteLine("Send:{message}");
}
}
}
}
}
3.创建消费者
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简单RabbitMQ使用
{
public class 消费者
{
public void DoWork()
{
var factory = new ConnectionFactory();
factory.HostName = "192.168.2.111";
factory.UserName = "rabbitmq";
factory.Password = "rabbitmq";
string queueName = "myDate.test.Queue1";
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
//channel.QueueDeclare(queueName, false, false, false, null);
/* 这里定义了一个消费者,用于消费服务器接受的消息
* C#开发需要注意下这里,在一些非面向对象和面向对象比较差的语言中,是非常重视这种设计模式的。
* 比如RabbitMQ使用了生产者与消费者模式,然后很多相关的使用文章都在拿这个生产者和消费者来表述。
* 但是,在C#里,生产者与消费者对我们而言,根本算不上一种设计模式,他就是一种最基础的代码编写规则。
* 所以,大家不要复杂的名词吓到,其实,并没那么复杂。
* 这里,其实就是定义一个EventingBasicConsumer类型的对象,然后该对象有个Received事件,
* 该事件会在服务接收到数据时触发。
*/
// var consumer = new EventingBasicConsumer(channel);//消费者
var consumer = new QueueConsumer(channel);//消费者
channel.BasicConsume(queueName, true, consumer);//消费消息
#region 消费方法1
//consumer.Received += (model, ea) =>
//{
// var body = ea.Body;
// var message = Encoding.UTF8.GetString(body);
// Console.WriteLine(message);
//};
#endregion
while (true)
{
var bodyObj = consumer.ReceiveTimeOut();
if (bodyObj == null)
{
continue;
}
var bodymesage = bodyObj.Body;
var message = Encoding.UTF8.GetString(bodymesage);
Console.WriteLine(message);
}
}
}
}
}
}
4.演示
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 简单RabbitMQ使用
{
class Program
{
static void Main(string[] args)
{
生产者 sss = new 生产者();
Task.Factory.StartNew(sss.DoWork);
//sss.DoWork();
消费者 aa = new 消费者();
Task.Factory.StartNew(aa.DoWork);
//aa.DoWork();
Console.Read();
}
}
}