如果我的 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")
附加器:
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 时,是否可以在消息处理程序中记录未处理的异常?
提前致谢。
最佳答案
我建议使用配置文件而不是代码来配置附加程序。这样,无论谁操作您的软件,都可以决定如何记录内容。标准的 AdoNetAppender 具有以下配置开关:
<param name="UseTransactions" value="False" />
我认为这会按照你想要的方式工作。如果您确实想使用自己的附加程序,您可以查看 log4net 源代码,了解他们是如何做到这一点的。他们可能将 TransactionScope
类与 TransactionScopeOption.Suppress
option 结合使用。 .
关于database - 将异常记录到 NServiceBus 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929441/