2017-03-06 29 views
0

下面是一个使用4.1.1版本RabbitMQ.Client一个简单的程序:的RabbitMQ .NET客户端确实没有引发错误立即

var message = Encoding.UTF8.GetBytes("test"); 
var cf = new ConnectionFactory(); 
using (var conn = cf.CreateConnection()) 
using (var channel = conn.CreateModel()) 
{ 
    int i = 1; 
    while (true) 
    { 
     Console.WriteLine(i++); 
     channel.BasicPublish("nonexistent", "", body: message); 
    } 
} 

在这里,我想发布到尚未宣布服务器上的交流。这导致错误,即404,NOT_FOUND - no exchange 'nonexistent' in vhost '/',被抛出。但是,错误并不是立即在第一个BasicPublish调用上抛出,而是随机下降。在8,22,40个电话给BasicPublish等后我被抛出。ModelShutdown事件在异常发生后才引发,所以它也没有帮助。

问题是,为什么它不立即抛出,所以我可以检测到错误并采取行动?它表现得好像一些发布成功,但实际上它们没有成功。我能做些什么来使客户的行为可预测?谢谢。

回答

0

我认为问题可能是BasicPublish返回时不能保证消息到达RabbitMQ服务器。因此,当您尝试发布到不存在的交易所时,您不能立即发生异常。

我想你可以尝试两种不同的方法:

  • 宣布更换前的发布,所以你不必担心汇率
  • 使用一个“可靠”的发布方式存在:发布确认或交易(您可以找到更多信息here