首页 > 其他 > 详细

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

时间:2017-12-27 14:54:42      阅读:184      评论:0      收藏:0      [点我收藏+]

创建一个工作队列

 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(工作队列)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!