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

Posted missliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的RabbitMQ学习2(工作队列)相关的知识,希望对你有一定的参考价值。

创建一个工作队列

 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(工作队列)的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 学习---- 工作队列模式

RabbitMQ 学习---- 工作队列模式

RabbitMQ学习工作队列

RabbitMQ 消息队列学习

我的RabbitMQ学习之旅3 (发布/订阅)

celery学习笔记2