目录
RabbitMQ安装:
erlang下载地址:http://www.erlang.org/downloads
RabbitMQ下载地址:http://www.rabbitmq.com/
在windows中安装RabbitMQ还是十分简便的,在以前地址找到合适的安装包下载。
先安装erlang,因为RabbitMQ服务端使用的语言是erlang。注意安装时,以管理员身份安装。
再安装RabbitMQ,一步步安装就可以啦。
配置环境变量,方便使用插件。在rabbitmq的安装目录找到RabbitMQ Server\rabbitmq_server-3.6.6\sbin,添加到环境变量path中。如下图:
执行一个bat文件
@echo on
attrib -R "C:\Users\daisy\.erlang.cookie"
copy /y "C:\Windows\.erlang.cookie" "C:\Users\daisy\.erlang.cookie"
cd /d "C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.6\sbin"
call rabbitmqctl.bat add_user daisy daisy
call rabbitmqctl.bat set_user_tags daisy administrator
call rabbitmqctl.bat set_permissions -p / daisy ".*" ".*" ".*"
call rabbitmq-plugins.bat enable rabbitmq_management
拷贝windows下的cookie到用户目录下
创建用户
然后安装RabbitMQ的web监控插件
访问127.0.0.1:15672即可看到该可视化页面。
rabbitMQ概念
遵循AMQP协议,使用erlang语言实现
AMQP 高级消息队列协议
AMQP:
1.connection => open、use、close 【open-ok、close、tune-ok】
2.channel => open、flow、close 【构建在connection之上,在amqp中常作为长链接】
3.exchange
4.queue是
5.basic => 发布和获取message中的一些设置
6.tx => 事务处理
7.confirm => 发布确认机制
erlang自带数据库 measia
交换机的四种类型: 不同类型的交换机,定义了不同的规则
- direct: 直连 提前预知性的binding info,bug.error->exchange
- headers :and、or 性的binding x-match any all
- topic: 归类性的binding,天生带有正则
- fanout: 多播现象,群发性的binding
RabbitMQ demo
生产者:
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://daisy:daisy@127.0.0.1:5672/")
};
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
//一次只处理一个,串行处理队列中消息,不会给应用程序造成太大的负担
channel.BasicQos(0,1,false);
//定义溢出消息发送的交换机
channel.ExchangeDeclare("mydead_exchange", ExchangeType.Direct);
//声明一个带名称的队列
channel.QueueDeclare("hello", true, false, false, new Dictionary<string, object>()
{
{ "x-max-length",10}, //队列存放最多的条数
{ "x-dead-letter-exchange","mydead_exchange"}, //超过最大限度的,从前面开始,发到这个交换机,然后通过路由key,路由到指定的队列中
{ "x-dead-letter-routing-key","medead_key"},
});
//将消息标记为持久性,同时需要指定队列的durable为true
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
//构建byte消息数据包
string message = "Hello World!";
var i = 0;
do
{
var body = Encoding.UTF8.GetBytes(message + i);
properties.Priority = (byte)i;
channel.BasicPublish("", "hello", properties, body);
Console.WriteLine("[x] send {0}:{1}", message, i);
i++;
Console.WriteLine("是否继续发送消息。是:y,否:其他任意键");
} while (Console.ReadKey().KeyChar.Equals('y'));
}
Console.ReadKey();
}
消费者:
var factory = new ConnectionFactory
{
Uri = new Uri("amqp://daisy:daisy@127.0.0.1:5672")
};
using (var conn = factory.CreateConnection())
{
using (var channel = conn.CreateModel())
{
#region test
//定义交换机
channel.ExchangeDeclare("myexchange", ExchangeType.Direct);
//定义队列log_else,路由debug、info、warning都指向该队列
channel.QueueDeclare("log_else", true, false, false, null);
var array = new string[3] { "debug", "info", "warning" };
foreach (var s in array)
{
channel.QueueBind("log_else", "myexchange", s, null);
}
//定义队列log_error,路由为error
channel.QueueDeclare("log_error", true, false, false, null);
channel.QueueBind("log_error", "myexchange", "error", null);
#endregion
//定义溢出信息存放队列
channel.QueueDeclare("mydead_queue", true, false, false, null);
channel.QueueBind("mydead_queue", "mydead_exchange", "medead_key", null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine("[x] received {0}", message);
// ReSharper disable once AccessToDisposedClosure
//发送消息,手动确认
channel.BasicAck(ea.DeliveryTag, false);
};
channel.BasicConsume("hello", false, consumer); //false 关闭自动确认
Console.WriteLine("Press [enter] to Exit");
Console.ReadKey();
}