2017-03-06 98 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