RabbitMq参数说明

https://www.cnblogs.com/longlongogo/p/6489574.html

public static QueueDeclareOk QueueDeclare(this IModel model, string queue = "", bool durable = false, bool exclusive = true, bool autoDelete = true, IDictionary<string, object> arguments = null);

queue:这没什么好说的,队列名

durable:是否持久化,那么问题来了,这是什么意思?持久化,指的是队列持久化到数据库中。在之前的博文中也说过,如果RabbitMQ服务挂了怎么办,队列丢失了自然是不希望发生的。持久化设置为true的话,即使服务崩溃也不会丢失队列

exclusive:是否排外,what? 这又是什么呢。设置了排外为true的队列只可以在本次的连接中被访问,也就是说在当前连接创建多少个channel访问都没有关系,但是如果是一个新的连接来访问,对不起,不可以,下面是我尝试访问了一个排外的queue报的错。还有一个需要说一下的是,排外的queue在当前连接被断开的时候会自动消失(清除)无论是否设置了持久化

autoDelete:这个就很简单了,是否自动删除。也就是说queue会清理自己。但是是在最后一个connection断开的时候

arguments:这个值得拿出来单讲一次,暂时不说

消息的QoS

QoS = quality-of-service, 顾名思义,服务的质量。通常我们设计系统的时候不能完全排除故障或保证说没有故障,而应该设计有完善的异常处理机制。在出现错误的时候知道在哪里出现什么样子的错误,原因是什么,怎么去恢复或者处理才是真正应该去做的。在接收消息出现故障的时候我们可以通过RabbitMQ重发机制来处理。重发就有重发次数的限制,有些时候你不可能不限次数的重发,这取决于消息的大小,重要程度和处理方式。

甚至QoS是在接收端设置的。发送端没有任何变化,接收端的代码也比较简单,只需要加如下代码:

channel.BasicQos(0, 1, false);

代码第一个参数是可接收消息的大小的,但是似乎在客户端2.8.6版本中它必须为0,即使:不受限制。如果不输0,程序会在运行到这一行的时候报错,说还没有实现不为0的情况。第二个参数是处理消息最大的数量。举个例子,如果输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息,消息只会在队列中阻塞。如果输入3,那么可以最多有3个消息不应答,如果到达了3个,则发送端发给这个接收方得消息只会在队列中,而接收方不会有接收到消息的事件产生。总结说,就是在下一次发送应答消息前,客户端可以收到的消息最大数量。第三个参数则设置了是不是针对整个Connection的,因为一个Connection可以有多个Channel,如果是false则说明只是针对于这个Channel的。

这种数量的设置,也为我们在多个客户端监控同一个queue的这种负载均衡环境下提供了更多的选择。

var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" };
            using (var connection = factory.CreateConnection())
            {
                //rabbitmq服务端
                using (IModel channel = connection.CreateModel())
                {
                    //在MQ上定义一个持久化队列,如果名称相同不会重复创建
                    channel.QueueDeclare("TestQueue", true, false, false, null);

                    //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
                    channel.BasicQos(0, 1, false);

                    //在队列上定义一个消费者
                    var consumer = new QueueingBasicConsumer(channel);
                    //消费队列,并设置应答模式为程序主动应答
                    channel.BasicConsume("TestQueue", false, consumer);

                    while (true)
                    {
                        //阻塞函数,获取队列中的消息
                        var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        string str = Encoding.UTF8.GetString(bytes);
                        var msg = JsonConvert.DeserializeObject<RequestMsg>(str);
                        Console.WriteLine("HandleMsg:" + msg.Name.ToString());
                        //回复确认
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                }
}

  

 

var factory = new ConnectionFactory() { HostName = "192.168.5.199", UserName = "rabbit", Password = "123456" };
                //rabbitmq客户端
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("PosQueue", true, false, false, null);
                    while (true)
                    {
                        var requestMsg = new RequestMsg();
                        requestMsg.Name = string.Format("Name_{0}", "ccc");
                        requestMsg.Code = string.Format("Code_{0}", "eee");
                        string jsonStr = JsonConvert.SerializeObject(requestMsg);
                        byte[] bytes = Encoding.UTF8.GetBytes(jsonStr);

                        //设置消息持久化
                        IBasicProperties properties = channel.CreateBasicProperties();
                        properties.DeliveryMode = 2;
                        channel.BasicPublish("", "PosQueue", properties, bytes);

                        Console.WriteLine("消息已发送:" + requestMsg.ToString());

                    }
                }
            }

  

posted @ 2018-01-16 16:30  xszjk  阅读(393)  评论(0)    收藏  举报