Received事件和BasicConsume之间的不可预测的调用顺序

时间:2016-06-07 08:56:34

标签: c# lambda rabbitmq

我的问题是,我的代码运行不可预测。首先是我的代码:

var receivedmsg = "empty_string";
channel.QueueDeclare(queue: "rabbittestqueue",
                        durable: false,
                        exclusive: false,
                        autoDelete: false,
                        arguments: null);

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body;
    String message = Encoding.UTF8.GetString(body);
    Console.WriteLine(" [x] Received message1: {0}", message); 
    receivedmsg = message;

};
channel.BasicConsume(queue: "rabbittestqueue",
                        noAck: true,
                        consumer: consumer);

Console.WriteLine(" [x] Received message2: {0}", receivedmsg); 
return receivedmsg;

问题是, [x]收到消息2 有时先运行,然后 [x]收到消息1

我正在使用的代码来自这里: https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

为什么会这样?

2 个答案:

答案 0 :(得分:1)

因为你写了

Console.WriteLine(" [x] Received message2: {0}", receivedmsg);

在“主线程”和

Console.WriteLine(" [x] Received message1: {0}", message);

如果收到消息时发生。控制台输出顺序将在99.99%的时间内完成。

答案 1 :(得分:0)

您正在使用“推送”消费者方法来提取消息。

如果您想从队列中“拉”消息,请使用“拉API”,称为BasicGet而不是BasicConsume

拥有可预测且同步的“推送API”是自相矛盾的。当它发生时会发生“推动”...而不是当你希望它在你的应用程序中发生时。这就是“推动”API的重点。

您可以找到常规API说明here,尤其是标题获取单个邮件(“拉API”)按订阅检索邮件(“推送API”)< /强>