RabbitMQ c#

RabbitMQ是依赖于erlang环境,先安装erlang环境,在安装RabbitMQ全程不会有啥问题,安装完成后,RabbitMQ服务会自动启动起来,可以在服务中看到。

使用命令,需要切换到sbin文件夹目录

RabbitMQ用户配置:

得到所有用户:rabbitmqctl list_users

添加用户信息:rabbitmqctl add_user sa 123456

添加用户角色:rabbitmqctl set_user_tags sa administrator

启用RabbitMQ的界面管理命令:

rabbitmq-plugins enable rabbitmq_management

如果报错:None of the specified endpoints were reachable

则需要设置权限,检查防火墙。我的是没有权限:如下图

RabbitMQ c#

然后点击用户点击设置权限即可

RabbitMQ c#

 

回车,然后在浏览器打开安装机器的IP+15672端口

以下是代码操作:

        //队列的相关操作================================
        //数据入队
        public static bool SendQueue(string queue, string json, string key = "")
        {
            CheckChannel(queue, key);
            byte[] body = Encoding.UTF8.GetBytes(json);
            dic[key].Item1.BasicPublish("", queue, dic[key].Item2, body);
            bool result = dic[key].Item1.WaitForConfirms();
            return result;
        }

        //从队列中取出数据
        //接受封装,势必在引用地方都要引入rabbitmq包
        public static string ReceiveQueue(string queue, string key = "")
        {
            CheckChannel(queue, key);
            //autoAck:true表示,需要调用确认方法。false表示取出了就没有了
            //channel.BasicAck(result.DeliveryTag, false);
            BasicGetResult result = dic[key].Item1.BasicGet(queue, true);
            if (result == null)
            {
                return null;
            }
            else
            {
                byte[] body = result.Body;
                string msg = Encoding.UTF8.GetString(body);
                return msg;
            }
        }

        //验证连接对象
        private static Dictionary<string, Tuple<IModel, IBasicProperties>> dic = new Dictionary<string, Tuple<IModel, IBasicProperties>>();
        static void CheckChannel(string queue, string key = "")
        {
            if (!dic.ContainsKey(key))
            {
                ConnectionFactory factory = new ConnectionFactory();
                factory.HostName = "localhost";
                factory.UserName = "sa";
                factory.Password = "123456";
                //创建连接
                IConnection connection = factory.CreateConnection();
                IModel channel = connection.CreateModel();
                //开启持久化
                IBasicProperties properties = channel.CreateBasicProperties();
                properties.DeliveryMode = 2;
                //开启确认模式
                channel.ConfirmSelect();
                dic.Add(key, Tuple.Create<IModel, IBasicProperties>(channel, properties));
            }
            dic[key].Item1.QueueDeclare(queue, true, false, false, null);
        }

 

踩坑,需要注意一点,多线程不能使用同一个IModel,不然跑着跑着会报一个错误出来,后面的空字符串参数是用来区别线程用的。

 

rabbitmq修改disc为ram模式命令,首先停止服务,不要停止服务里面的rabbitmq服务,开始命令

rabbitmqctl stop_app

rabbitmqctl change_cluster_node_type ram

rabbitmqctl start_app

完成,修改disc模式也是,成功只会提示一行英文

Turning "xxxx" into a disc node

 

集群配置:

首先统一各个机器上的.erlang.cookie文件信息,注意,在win系统上有三个地方都需要修改,C:\Windows和C:\Users\Administrator还有C:\Windows\System32\config\systemprofile,你当前登录用户目录,这个文件默认是只读属性,改完记得改回来。

注意:如果一直报错:unable to connect to node rabbit@xxx :nodedown,保证cookie文件一直,最好全局搜索下C下这个文件即可.

然后修改hosts文件的东西,格式192.168.1.1 xxx,其中xxx为你的主机名,集群中的所有ip和主机名都要写在文件中,每个机器都是一样。

使用 -detached 参数运行各节点
rabbitmqctl stop
rabbitmq-server -detached

将当前集群加到node1节点中

rabbitmqctl stop_app 
rabbitmqctl join_cluster [email protected]
rabbitmqctl start_app

然后就特么完事?就这几行命令,但是我相信一定一堆问题,我的集群成功了,但是在计算机服务中的服务显示没有启动,你去启动的时候会报错1067,然后集群还能照常使用,就这么简单,但是配置环境会出现各种各样的问题,我第二次练习还是不知道怎么把集群给搞成功的......

参考链接:http://88250.b3log.org/rabbitmq-clustering-ha

 

 

 

转载于:https://my.oschina.net/uwith/blog/1554086