Повторное исключение приводит к тому, что мои данные не сохраняются - PullRequest
0 голосов
/ 15 марта 2012

У меня есть этот код:

catch (Exception e)
{
    try
    {
        transmitModel.AddAck(transmitBatchId,
          "<error><message>" + e.Message + "</message><stack>" + e.StackTrace +
          "</stack><Location>FromLisAtOMServer<Location>" +
          "<TransmitBatchId>" + message.TransmitBatchId +
          "</TransmitBatchId></error>", false, true);
    }
    // If we fail to log, we don't want that to bubble up... 
    // We want the real error to do that.
    catch (Exception){}

    // Re-throw the exception so that the service bus will 
    // move this off to the error queue.);
    throw;
}

Метод AddAck сохранит эту строку в базе данных (используя Entity Framework).

Когда я запускаю это без последнего оператора throw, он сохраняет мое сообщение об ошибке в базу данных штрафа.

Когда у меня есть throw; там, он говорит, что сохраняет, но когда я запрашиваю базу данных, его там нет. Я даже могу выполнить запрос сущности через мой контекст данных сразу после сохранения (в коде), и он возвращает значение, как будто оно сохранено (хотя это может быть использование кэшированной версии). Но если я пойду и сделаю запрос, то данных там не будет ...

Я проверил, чтобы убедиться, что никакая другая логика не приводит к удалению значения в исключении.

Есть идеи, что может быть причиной этого?

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

ОК, опубликуйте ответ здесь, это очень легко вспомнить, потому что я сталкивался с той же проблемой и понял, что это просто потому, что я не совершил транзакцию с БД. Спасибо:)

0 голосов
/ 15 марта 2012

Возможно, что NServiceBus предоставляет хуки для такого рода вещей.

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

С Shuttle ESB (http://shuttle.codeplex.com/) мы используем конвейеры для обработки различных вариантов использования, и вы можете подключиться к событию PipelineException, которое вызывается различными конвейерами. Shuttle имеет возможность для разработчиков добавлять модули, которые подключаются к различным событиям Уже существует SystemExceptionModule, который делает более или менее то, что вы хотите сделать.

0 голосов
/ 15 марта 2012

Этот вызов является результатом сообщения NServiceBus.

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

Мне нужно выяснить, как заставить этот файл журнала публиковать вне транзакции ...

...