Регистрация исключений в базе данных в NServiceBus - PullRequest
2 голосов
/ 28 мая 2010

Если в моем MessageHandler возникает исключение, я хочу записать сведения об исключении в свою базу данных. Как мне это сделать?

Очевидно, что я не могу просто перехватить исключение, записать в базу данных и перебросить его, поскольку NSB откатывает все изменения. (IsTransactional имеет значение true)

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

public void Handle(MessageItem message)
{
    try
    {
        DoWork();
    }
    catch(Exception exc)
    {
        Bus.SendLocal(new ExceptionMessage(exc.Message));
        throw;
    }
}

Я также пытался использовать Log4Net с пользовательским приложением, но это также откатывалось.

Configure.With()
.Log4Net<DatabaseAppender>(a => a.Log = "Log")

Appender:

public class DatabaseAppender : log4net.Appender.AppenderSkeleton
{
    public string Log { get; set; }

    protected override void Append(log4net.Core.LoggingEvent loggingEvent)
    {
        if (loggingEvent.ExceptionObject != null)
            WriteToDatabase(loggingEvent.ExceptionObject);
    }
}

Есть ли способ регистрировать необработанные исключения в обработчике сообщений, когда IsTransactional имеет значение true?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 28 мая 2010

Рекомендую настроить аппендеры с помощью файла конфигурации, а не в коде. Таким образом, кто бы ни управлял вашим программным обеспечением, он может решить, как следует регистрировать материал. Стандартный AdoNetAppender имеет следующий конфигурационный переключатель:

<param name="UseTransactions" value="False" />

Я думаю, что это будет работать так, как вы хотите. Если вы действительно хотите использовать свой собственный appender, вы можете проверить в исходном коде log4net, как они это делают. Вероятно, они используют класс TransactionScope с параметром TransactionScopeOption.Suppress .

0 голосов
/ 02 июня 2016

NServiceBus уже регистрирует обработчик и саги исключений OOTB. Эти записи журнала можно настроить для входа в любую из распространенных библиотек журналов

Вы также можете подписаться на уведомления об ошибках и обрабатывать их программно

...