项目准备
本篇以控制台项目做讲解,在项目中添加一个生产者,两个消费者,一共三个控制台。
在每个项目中添加Nuget引用:RabbitMQ.Client
新建帮助类:
public class MQHelper
{
public static ConnectionFactory GetConnectionFacroty()
{
return new ConnectionFactory()
{
HostName = "localhost", //远程服务器设置为对方服务器IP地址或机器名称
UserName = "guest", //RabbitMQ内置账号
Password = "123456", //RabbitMQ账号密码
RequestedHeartbeat = 0,
};
}
}
简单模式
简单模式就是生产者直接将消息发送到队列,然后消费者直接消费
生产端代码:
public static void ProduceSimpleMode()
{
string queuename= "SimpleModeQue";
var factory = MQHelper.GetConnectionFacroty();
using (var connnection = factory.CreateConnection())
{
using (var channel = connnection.CreateModel())
{
channel.QueueDeclare(queuename,false,false,false,null);
int i = 1;
while (i<=50)
{
//消息内容
string message = "简单模式OneToOne 消息--" + i.ToString().PadLeft(4, '0');
var body1 = Encoding.UTF8.GetBytes(message);
//发送消息
Thread.Sleep(i * 10);
channel.BasicPublish("",queuename,null, body1);
Console.WriteLine("生产了消息:{0}", message);
i++;
}
}
Console.ReadLine();
}
}
消费者1 代码:
public static void ConsumerSimpleMode()
{
var queuename = "SimpleModeQue";
var factory = MQHelper.GetConnectionFacroty();
using (var connnection = factory.CreateConnection())
{
using (var channel = connnection.CreateModel())
{
channel.QueueDeclare(queuename, false, false, false, null);
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
channel.BasicConsume(queuename, false, consumer);
channel.BasicQos(0, 1, true); //能者多劳
int i = 1;
while (true)
{
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
var message = Encoding.UTF8.GetString(bytes);
Console.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n收到第[" + i + "]条消息,内容:" + message);
Thread.Sleep(1000);
channel.BasicAck(ea.DeliveryTag, false);
i++;
}
}
}
}
生产者与消费者1 主函数中分别调用上面的方法
工作模式
该模式相比简单模式,增加了消费者的数量!在消费者2中添加上面相同的代码
public static void ConsumerSimpleMode()
{
var queuename = "SimpleModeQue";
var factory = MQHelper.GetConnectionFacroty();
using (var connnection = factory.CreateConnection())
{
using (var channel = connnection.CreateModel())
{
channel.QueueDeclare(queuename, false, false, false, null);
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
//第二个设置是否自动应答
channel.BasicConsume(queuename, false, consumer);
//channel.BasicQos(0, 1, true); //可以在生产者中定义
int i = 1;
while (true)
{
BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
byte[] bytes = ea.Body;
var message = Encoding.UTF8.GetString(bytes);
Console.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") +<