码迷,mamicode.com
首页 > 其他好文 > 详细

我的RabbitMQ学习2(工作队列)

时间:2017-12-27 15:25:27      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:console   factor   mqc   task   rabbitmq   释放   utf8   readline   arguments   

创建一个工作队列

 1.建立一个生成者 

       //初始化一个连接 生产者 -> (消费者)
            var factory = new ConnectionFactory()
            { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                //对应的队列
                channel.QueueDeclare(queue: "order_task",
                                     durable: true,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);

                var consumer = new EventingBasicConsumer(channel);

                //接受消息
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine("接受到信息: {0} mode:{1}", message, model);
                };
                channel.BasicConsume("order", true, consumer);
                Console.ReadLine();
            }

 

2.建立一个消费者 但是不自动消费它

 

//autoAck = false 表示不自动确实 也就代表会一直存在消息队列中
//弊端:官方==》错过BasicAck是一个常见的错误。这是一个容易的错误,但后果是严重的。当你的客户退出时,消息会被重新传递(这可能看起来像是随机的重新传递),但是RabbitMQ会占用越来越多的内存,因为它不能释放任何未被消息的消息。

为了调试这种错误,你可以使用rabbitmqctl 打印messages_unacknowledged字段:

 //初始化一个连接 生产者 -> (消费者)
            var factory = new ConnectionFactory()
            { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                //对应的队列
                channel.QueueDeclare(queue: "order_task",
                                     durable: true,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);

                var consumer = new EventingBasicConsumer(channel);

                //接受消息
                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine("接受到信息: {0} mode:{1}", message, model);
                };
                //autoAck = false 表示不自动确实 也就代表会一直存在消息队列中
                //弊端:官方==》错过BasicAck是一个常见的错误。这是一个容易的错误,但后果是严重的。当你的客户退出时,消息会被重新传递(这可能看起来像是随机的重新传递),但是RabbitMQ会占用越来越多的内存,因为它不能释放任何未被消息的消息。
                //为了调试这种错误,你可以使用rabbitmqctl 打印messages_unacknowledged字段:
                channel.BasicConsume("order", false, consumer);
                Console.ReadLine();
            }

 

我的RabbitMQ学习2(工作队列)

标签:console   factor   mqc   task   rabbitmq   释放   utf8   readline   arguments   

原文地址:https://www.cnblogs.com/missliu/p/8074581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!