Fork me on GitHub
moyuanhui
牛嗷嗷

RabbitMQ的基本使用到高级特性

简介

继上一篇 CentOS上安装RabbitMQ讲述RabbitMQ具体安装后,这一篇讲述RabbitMQ在C#的使用,这里将从基本用法到高级特性的使用讲述。

前序条件

这里需要增加一个用户,并且设置用户为administrator,更多命令可以参考RabbitMQ更多命令,这里开始我本来是想用guest用户,端口是:15672,但是在创建连接的时候是连接不上的,查资料后发现是必须开放5672端口,并且不能使用guest默认用户

rabbitmqctl add_user allen pwd   //增加用户
rabbitmqctl set_user_tags allen administrator  //设置用户权限
rabbitmqctl change_password allen newpass  //修改密码

开启5672端口

firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload

基本用法

连接之前可以看到,rabbitmq的UI界面是没有连接的
send发布者的代码

    /// <summary>
    /// 发送消息
    /// </summary>
    public class Send
    {
        private static readonly string appID = ConfigurationManager.AppSettings["AppID"];

        static void Main(string[] args)
        {
            var factory = new ConnectionFactory { Uri = ConfigurationManager.AppSettings["RabbitMQUri"] };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    string queue = string.Format("MQ{0}.BaseStudy", appID);

                    channel.QueueDeclare(queue, false, false, false, null);   //定义一个队列

                    while (true)
                    {
                        Console.Write("请输入要发送的消息:");
                        var message = Console.ReadLine();
                        var body = Encoding.UTF8.GetBytes(message);

                        channel.BasicPublish("", queue, null, body); //发送消息

                        Console.WriteLine("已发送的消息: {0}", message);
                    }
                }
            }            
        }
    }

RabbitMQUri,和AppID

<add key="AppID" value="150107"/>    <!--队列ID-->  
<add key="RabbitMQUri" value="amqp://test_user:123456@111.231.204.119:5672/" /> <!--连接字符串-->

RabbitMQUri的Value相当于:

 <add key="RabbitMQ_HostName" value="111.231.204.119"/>
  <add key="RabbitMQ_UserName" value="test_user"/>
  <add key="RabbitMQ_Password" value="123456"/>
  <add key="RabbitMQ_Port" value="5672"/>
  <add key="RabbitMQ_VirtualHost" value="/"/>

未建立连接时:

建立连接后:

发送消息

可以看到RabbitMQ的UI管理界面的消息有:

receive消费者收到的消息:

receive的代码:

/// <summary>
    /// 接收消息
    /// </summary>
    public class Receive
    {
        private static readonly string appID = ConfigurationManager.AppSettings["AppID"];

        static void Main(string[] args)
        {
            var factory = new ConnectionFactory { Uri = ConfigurationManager.AppSettings["RabbitMQUri"] };
            using (var connection = factory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    string queue = string.Format("MQ{0}.BaseStudy", appID);

                    channel.QueueDeclare(queue, false, false, false, null);   //定义一个队列

                    Console.WriteLine("准备接收消息:");                    

                    var consumer = new EventingBasicConsumer(channel);
                    consumer.Received += (s, e) =>
                    {
                        var body = e.Body;
                        var message = Encoding.UTF8.GetString(body);
                        Console.WriteLine("接收到的消息: {0}", message);
                    };
                    channel.BasicConsume(queue, true, consumer);  //开启消费者与通道、队列关联

                    Console.ReadLine();
                }
            }            
        }

如果遇到这种情况:

OperationInterruptedException: The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=530, text="NOT_ALLOWED - access to vhost 'test' refused for user 'allen'", classId=10, methodId=40, cause=

这是权限问题,尽管我们已经设置了allen用户为administrator管理员,也就是:用户‘allen’没有权限访问‘/’
解决方案:

#sudo rabbitmqctl list_users
列出用户权限
Listing users ...
allen [administrator]
guest [administrator]
#sudo rabbitmqctl  set_permissions -p / allen '.*' '.*' '.*'

该命令使用户allen具有‘/’这个virtual host中所有资源的配置、写、读权限以便管理其中的资源
最后,附上源码地址,包括RabbitMQ的基本用法,发布订阅,高级特性DEMO

posted @ 2018-01-19 10:48  牛嗷嗷  阅读(758)  评论(5编辑  收藏  举报