2013-08-07 1 views
0

В блоге пост RabbitMQ на Publisher Confirms говоритРазличать ОППЫ и другие ошибки при работе в режиме подтверждающего

, если соединение между издателем и брокером падает с выдающимися подтверждает, что не обязательно означает, что сообщения были утеряны, поэтому повторная публикация может привести к дублированию сообщений.

Это означает, что IModel.WaitForConfirmsOrDie() будет сгенерировано исключение (так же, как быстрый тест подтвердил), когда соединение с брокером падает во время ожидания Ack, но сообщение все равно может быть доставлено. Есть ли способ отличить, посмотрев на исключения, будь то определенно не был доставлен

  1. сообщение
  2. сообщение может быть доставлено

Другими словами, существует ли способ, безусловно, различать все (потенциально возможные) Nack s (= не доставлено) от других ошибок, таких как сброшенные соединения (после того, как сообщение было принято у брокера)?

АНИ документы говорят только

Если NACK получен, бросает исключение OperationInterruptedException сразу

В моем «уронить соединение» тест, ап (исключение, полученный из) OperationInterruptedException был брошен в так что, похоже, исключает просмотр только типа исключения.

ответ

1

Глядя на исходный код (.net клиента 3.1.3), похоже, что документация не совсем точно, как IOException брошено в случае NACKS, довольно странный выбор, если вы спросите меня:

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

К сожалению, это только исходный код, и спецификация (в api docs) отличается. В любом случае, это выглядит, как я мог себе это сделать:

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

Там, однако, кроме NACKS исключения, которые могут возникнуть и вовлекающее сообщение определенно не было отправлено, как при отправке нераскрытого существующий обмен. В этом случае вы получите AlreadyClosedException с ShutdownReason.ReplyCode из 404.

Edit: Мой тест в https://stackoverflow.com/a/18117000/709537 подтвердил, что выше IOException фактически брошено.

 Смежные вопросы

  • Нет связанных вопросов^_^