下面的消费者代码(不会从工作者示例中移除太多)在单个消息的几次迭代被解除之后抛出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通常会在设置自动确认后由于手动执行而关闭流时发生这种情况?
提前致谢。
答案 0 :(得分:2)
卫生署!我想我会在罕见的事件中留下这个问题,其他任何人都像我一样愚蠢。请注意上面的代码中将发生BasicNack,然后执行将继续执行Nack操作。这是该问题的(显而易见的)原因。我需要打屁股。
答案 1 :(得分:0)
关闭频道时会抛出此异常。 只有当我在几条消息之后调试我的代码时,它才会发生在我身上 所以我的猜测是我们在一段时间后才会暂停通道。 检查您的Rabbit配置