zoukankan      html  css  js  c++  java
  • .net使用rabbitmq安装操作

    自己在windows安装rabbitmq时,遇到了很多坑,最恶心的就是版本不匹配的问题,所以自己写了一篇总结,本文章安装的Erlang为8.2,rabbitmq为3.5.6

    1 安装rabbitmq,因为rabbitmq使用Erlang所编写的,所以先装好Erlang的环境,安装好之后,配置环境变量

    下载好之后,双击直接安装,下一步就行了(链接: https://pan.baidu.com/s/1QINySLYjVdouIDXAvDfKvg 提取码: nv9m)

     配置环境变量,就是Erlang的安装目录,将%ERLANG_HOME%in加入到path中

    做好之后,我们在cmd中输入erl,显示出版本号,我们的Erlang就安装好了。

    2 安装rabbitmq,下载地址(链接: https://pan.baidu.com/s/1GqzYnbHpzsT3cnhLFRb15g 提取码: cf2x),下载完成后,

    打开CMD命令,cd到安装目录(.. abbitmq_server-3.5.6sbin)下,然后在后面输入rabbitmq-plugins enable rabbitmq_management命令进行安装,访问http://localhost:15672。用户名和密码都是guest

    rabbitmq服务的启动和关闭 

    管理员权限打开cmd,然后切换到sbin目录下,执行

    net stop RabbitMQ && net start RabbitMQ

    如果不使用命令行方式,在任务管理器--服务中,找到RabbitMQ,右击停止或开始

    3配置rabbitmq用户权限

    RabbitMQ是存在用户权限的,默认是guest 密码也是guest,隶属于Administrator管理员下。现需要配置新用户和权限,继续打开CMD命令,cd到安装目录sbin下:

    用户操作指令:

    查询服务状态
    rabbitmqctl status
    
    列举虚拟主机列表
    rabbitmqctl list_vhosts
    列举用户列表
    rabbitmqctl list_users
    
     添加用户和密码
    rabbitmqctl add_user hxf 123000hxf
    
     设置权限 
    rabbitmqctl set_permissions hxf ".*" ".*" ".*"
    
     分配用户组
    rabbitmqctl set_user_tags hxf administrator
    
     删除guest用户
    rabbitmqctl delete_user guest
    修改用户密码
    rabbitmqctl change_password {username} {newpassowrd}
    

      

    4.通过Nuget添加RabbitMQ.Client引用,操作队列

      创建两个控制台实现一个producer发送消息,一个consumer接收消息,并在控制台打印出来。

        producer

        首先,需要创建一个ConnectionFactory,设置目标,由于是在本机,所以设置为localhost,如果RabbitMQ不在本机,只需要设置目标机器的IP地址或者机器名称即可,然后设置前面创建的用户名hxf和密码123000hxf。

        紧接着要创建一个Channel,如果要发送消息,需要创建一个队列,然后将消息发布到这个队列中。在创建队列的时候,只有RabbitMQ上该队列不存在,才会去创建。消息是以二进制数组的形式传输的,所以如果消息是实体对象的话,需要序列化和然后转化为二进制数组。

    static void Main(string[] args)
            {
                var factory = new ConnectionFactory();
                factory.HostName = "localhost";
                factory.UserName = "hxf";
                factory.Password = "123000hxf";
    
                using (var connection = factory.CreateConnection())
                {
                    //创建一个消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。类似与Hibernate中的Session
                    //AMQP协议规定只有通过channel才能指定AMQP命令,所以仅仅在创建了connection后客户端还是不能发送消息的,必须要创建一个channel才行
                    //RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection
                    using (var channel = connection.CreateModel())
                    {
                        //创建一个queue(消息队列)
                        channel.QueueDeclare("hello", false, false, false, null);
                        string message = "Hello World";
                        var body = Encoding.UTF8.GetBytes(message);
                        // 往队列中发出一条消息 使用了默认交换机并且绑定路由键(route key)与队列名称相同
                        channel.BasicPublish("", "hello", null, body);
                        //Console.WriteLine(" set {0}", message);
                        string message1 = "Hello World1";
                        var body1 = Encoding.UTF8.GetBytes(message1);
                        channel.BasicPublish("", "hello", null, body1);
                        string message2 = "Hello World2";
                        var body2 = Encoding.UTF8.GetBytes(message2);
                        channel.BasicPublish("", "hello", null, body2);
                    }
                }
            }

        /* CreateConnection 创建一个连接连接到broker
        CreateModel 创建一个channel 使用它来发送AMQP指令
        ExchangeDeclare 创建一个exchange 对消息进行路由
        QueueDeclare 创建一个queue 消息队列 这是一个装载消息的容器
        QueueBind 把exchange和queue按照路由规则绑定起来
        BasicPublish 往队列中发送一条消息
        BasicConsume 从队列中获取一条消息*/

    注意:1.队列只会在它不存在的时候创建,多次声明并不会重复创建。2.信息的内容是字节数组,也就意味着可以传递任何数据。

    使用rabbitmqctl 的list_queues可以查看所有的消息队列

      consumer

    using (var connection = factory.CreateConnection())
                {
                    using (var channel = connection.CreateModel())
                    {
                        channel.QueueDeclare("hello", false, false, false,null);
                        //创建事件驱动的消费者类型,尽量不要使用while(ture)循环来获取消息
                        EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
                        consumer.Received += (model, ea) =>
                        {
                            var body = ea.Body;
                            var message = Encoding.UTF8.GetString(body);
                            Console.WriteLine(" 我是消费者我接收到消息: {0}", message);
                        };
                        channel.BasicConsume("hello", true, consumer);

    exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

    本文中由于使用了默认交换机所以并没有用到 ExchangeDeclare和 QueueBind两个方法

    默认交换机实际上是一个由消息代理预先声明好的没有名字(名字为空字符串)的直连交换机。它有一个特殊的属性使得它对于简单应用特别有用处:那就是每个新建队列(queue)都会自动绑定到默认交换机上,绑定的路由键(routing key)名称与队列名称相同

    
    
    
    要有多努力才能对得起奔波的脚步和身上的期望
  • 相关阅读:
    01背包问题学习笔记
    状态压缩动态规划学习笔记
    并查集算法详解
    洛谷 P2939 [USACO09FEB]改造路Revamping Trails
    算法竞赛进阶指南 通信线路
    算法竞赛进阶指南 道路与航线
    NOIP2009 T3 最优贸易
    NOIP2017 Day1 T3 逛公园
    5.Go 语言数据类型:数组与切片
    4. Go 语言数据类型:byte、rune与字符串
  • 原文地址:https://www.cnblogs.com/hxfcodelife/p/10005809.html
Copyright © 2011-2022 走看看