RabbitMq是一种消息中间件。主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在。如果系统中出现以下情况,你可以考虑使用消息队列。
1.执行的任务非实时性的,并且执行此任务非常耗时。
2.需要进行异步消息的处理
3.应用解耦
4.消息通讯
Rabbitmq的使用:
(1)基本使用(Hello Word)
1.发送方
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
//创建一个链接
using(var connection=factory.CreateConnection())
{
//创建一个管道
var channel = connection.CreateModel();
//声明一个队列
channel.QueueDeclare("one",false,false,false,null);
for (int i = 0; i < 6; i++)
{
var message = "人生若只如初见!"+i;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.MessageId = Guid.NewGuid().ToString();
// properties.SetPersistent(true);
消息持久化(值为2),非持久化(值为1)
properties.DeliveryMode = 2;
//发送消息(每隔6秒钟发送一次消息),参数:1.交换机名称 2.路由关键字 3基本属性 4 消息内容
channel.BasicPublish("", "default", properties, body);
Thread.Sleep(6000);
}
}
Console.Read();
}
2 接收方
static void Main(string[] args)
{
//创建连接
var factory = new ConnectionFactory() { HostName="localhost"};
//创建一个链接到指定的端点
using(var connection=factory.CreateConnection())
{
//创建并返回一个通道,会话和模型
using(var channel=connection.CreateModel()){
//声明一个队列
channel.QueueDeclare("default",false,false,false,null);
//有消息到达将被自动接收
var customer =new EventingBasicConsumer(channel);
//注册接收事件
customer.Received += (model, ea) =>
{
var body = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine(body);
Console.WriteLine("正在等待~~~");
Thread.Sleep(7000);
};
//消息收到后,反馈一个应答消息给服务器。true是不需要应答
channel.BasicConsume("default", true, customer);
Console.Read();
}
}
}
(2)Publish/Subscribe模式(将消息分发到多个Consumer中)
1.发送端
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName="localhost" };
using(var connection=factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare("one_exchange", "fanout");
for (int i = 0; i < 10; i++)
{
var message = "人生若只如初见" + i;
var body=Encoding.UTF8.GetBytes(message);
channel.BasicPublish("one_exchange", "", null, body);
Thread.Sleep(2000);
}
}
}
Console.Read();
}
2接收端
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
//声明一个交换器
channel.ExchangeDeclare("one_exchange", "fanout");
//声明一个(随机)队列,获取队列名
string queuename = channel.QueueDeclare().QueueName;
//将队列和交换器进行绑定
channel.QueueBind(queuename, "one_exchange", "");
var customer = new EventingBasicConsumer(channel);
customer.Received += (model, ea) =>
{
Console.WriteLine(Encoding.UTF8.GetString(ea.Body));
//等待6秒
Thread.Sleep(6000);
};
//接收消息
channel.BasicConsume(queuename, true, customer);
Console.Read();
}
}
}