區分

2013-08-07 67 views
0

Publisher Confirms的RabbitMQ的博客文章說區分

如果出版商和經紀人之間的連接以優異的確認下降,這並不一定意味着信息丟失,所以重新發布可能會導致重複的消息。

這意味着IModel.WaitForConfirmsOrDie()將拋出一個異常(就像一個快速測試確認)時,在等待Ack到經紀人的連接斷開,但消息還是可能交付。有沒有一種方法來區分,通過查看異常,是否

  1. 消息肯定不會被傳遞
  2. 消息可能已交付

換句話說,是有辦法肯定將所有(潛在可能的)Nack(=未交付)與其他錯誤(如消息在代理處接受後)區分開來?

API文檔只能說

如果收到NACK,拋出OperationInterruptedException異常立即

在我的「點連接」測試,一個(異常源自)OperationInterruptedException被拋出好吧,所以這似乎排除只考慮類型的例外。

回答

1

查看源代碼(.NET客戶端3.1.3),好像文檔是不太準確的,作爲IOException中的Nack,一個相當奇怪的選擇的情況下被拋出,如果你問我:

public void WaitForConfirmsOrDie(TimeSpan timeout) 
{ 
    bool timedOut; 
    bool onlyAcksReceived = WaitForConfirms(timeout, out timedOut); 
    if (!onlyAcksReceived) { 
     ... 
     throw new IOException("Nacks Received"); 
    } 

不幸的是,這只是源代碼,並且規範(在api文檔中)有所不同。在任何情況下,它看起來像我現在這樣做:

bool definitelyNotSend = e is IOException && "Nacks Received".Equals(e.Message); 

有,但不是的Nack其他異常可能會發生,並暗示該消息也絕對不會被髮送,發送到一個非時喜歡現有的交換。在這種情況下,你會得到一個AlreadyClosedException與404的

一個ShutdownReason.ReplyCode編輯:我在https://stackoverflow.com/a/18117000/709537試驗證實,上述IOException異常實際上被拋出。