RabbitMQ手动ack throw"共享队列已关闭"

时间:2015-02-02 10:18:44

标签: c# rabbitmq

下面的消费者代码(不会从工作者示例中移除太多)在单个消息的几次迭代被解除之后抛出System.IO.EndOfStreamException(" SharedQueue已关闭")。

public void Consume ()
            {
                using (var connection = connectionFactory.CreateConnection ()) {
                    using (var channel = connection.CreateModel ()) {

                        channel.QueueDeclare (queueName, true, false, false, null);

                        // 0= “Dont send me a new message untill I’ve finshed”,  
                        // 1= “Send me one message at a time”
                        channel.BasicQos (0, 1, false);
                        var consumer = new QueueingBasicConsumer (channel);
                        channel.BasicConsume (queueName, false, consumer);

                        Console.WriteLine (" [*] Waiting for messages. " +
                        "To exit press CTRL+C");

                        while (true) {
                            BasicDeliverEventArgs ea;
                            try {
                                // block until a message can be dequeue
                                ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue ();

                                var body = ea.Body;
                                Console.WriteLine (" [x] Received, executing");

                                T thing = messageSerializer.Deserialize<T> (body);

                                try {
                                    executor.DynamicInvoke (thing);
                                } catch {
                                        channel.BasicNack (ea.DeliveryTag, false, true);
                                    }
                                }

                                channel.BasicAck (ea.DeliveryTag, false);
                            } catch (OperationCanceledException) {
                                logger.Error ("Bugger");
                            }
                        }
                    }
                }

我已经阅读了一些谷歌搜索结果,但AKAIK通常会在设置自动确认后由于手动执行而关闭流时发生这种情况?

提前致谢。

2 个答案:

答案 0 :(得分:2)

卫生署!我想我会在罕见的事件中留下这个问题,其他任何人都像我一样愚蠢。请注意上面的代码中将发生BasicNack,然后执行将继续执行Nack操作。这是该问题的(显而易见的)原因。我需要打屁股。

答案 1 :(得分:0)

关闭频道时会抛出此异常。 只有当我在几条消息之后调试我的代码时,它才会发生在我身上 所以我的猜测是我们在一段时间后才会暂停通道。 检查您的Rabbit配置