我的问题是,我的代码运行不可预测。首先是我的代码:
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
为什么会这样?
答案 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”)< /强>