AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
1、首先安装erlang
下载地址:http://www.erlang.org/downloads/20.3
2、RabbitMAQ安装
下载地址:http://www.rabbitmq.com/install-windows.html
安装完成后设置登录账户完成后重启服务
3、RabbitMQ常用命令
开启浏览器访问http://localhost:15672
默认userName:guest password:guest
创建用户
rabbitmqctl.bat add_user leimiaotang 123456
授权角色
(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
(5) 其他的
进入到sbin目录下执行命令
rabbitmq-server stop
rabbitmq-server start
生产者
class Program
{
static void Main(string[] args)
{
DirectExchangeSendMsg();
}
///
/// 连接配置
///
private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory()
{
HostName = "192.168.1.28",
UserName = "admin",
Password = "admin"
};
///
/// 路由名称
///
const string ExchangeName = "justin.exchange";
//队列名称
const string QueueName = "justin.queue";
public static void DirectExchangeSendMsg()
{
using (IConnection conn = rabbitMqFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null);
channel.QueueDeclare(QueueName, durable: true, autoDelete: false, exclusive: false, arguments: null);
channel.QueueBind(QueueName, ExchangeName, routingKey: QueueName);
var props = channel.CreateBasicProperties();
props.Persistent = true;
string vadata = Console.ReadLine();
while (vadata != "exit")
{
var msgBody = Encoding.UTF8.GetBytes(vadata);
channel.BasicPublish(exchange: ExchangeName, routingKey: QueueName, basicProperties: props, body: msgBody);
Console.WriteLine(string.Format("***发送时间:{0},发送完成,输入exit退出消息发送", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
vadata = Console.ReadLine();
}
}
}
}
}
消费者
static void Main(string[] args)
{
DirectAcceptExchangeEvent();
}
///
/// 连接配置
///
private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory()
{
HostName = "192.168.1.28",
UserName = "admin",
Password = "admin"
};
///
/// 路由名称
///
const string ExchangeName = "justin.exchange";
//队列名称
const string QueueName = "justin.queue";
public static void DirectAcceptExchangeEvent()
{
using (IConnection conn = rabbitMqFactory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
channel.QueueDeclare(QueueName, durable: true, autoDelete: false, exclusive: false, arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var msgBody = Encoding.UTF8.GetString(ea.Body);
Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
//CreateDB,EntCode CreateDB,1234567890ABCDEF
string[] oper=msgBody.Split(',');
if (oper[0].Equals("CreateDB"))
{
CreateDB createDB = new CreateDB();
createDB.CreateEntDB(oper[1], @"C:/Project/src/Code/CSTFinance/Ent.sql");
}
};
channel.BasicConsume(QueueName, true, consumer: consumer);
Console.WriteLine("按任意值,退出程序");
Console.ReadKey();
}
}
}
}