RabbitMQ——安装与概念

目录

RabbitMQ安装:

rabbitMQ概念

RabbitMQ demo

生产者:

 消费者:


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

交换机的四种类型: 不同类型的交换机,定义了不同的规则

  1. direct: 直连 提前预知性的binding info,bug.error->exchange
  2. headers :and、or 性的binding x-match any all
  3. topic: 归类性的binding,天生带有正则
  4. 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();
                }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值