3

我用hangfire运行进程,重复任务。这些任务设置为每分钟启动一次并处理数据库中的数千行。

我让它们在我的测试环境中顺利运行,直到我在这些方法中添加了 log4net 日志记录。现在 log4net 抛出一个线程错误。

log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
log4net:ERROR Failed to append to appender [AdoNetAppender]
System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.Monitor.ReliableEnter(Object obj, Boolean& lockTaken)
   at System.Threading.Monitor.Enter(Object obj, Boolean& lockTaken)
   at log4net.Appender.AppenderSkeleton.DoAppend(LoggingEvent loggingEvent)
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
log4net:ERROR Exception while logging
System.Threading.ThreadAbortException: Thread was being aborted.
   at log4net.Util.AppenderAttachedImpl.AppendLoopOnAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.CallAppenders(LoggingEvent loggingEvent)
   at log4net.Repository.Hierarchy.Logger.ForcedLog(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)
   at log4net.Repository.Hierarchy.Logger.Log(Type callerStackBoundaryDeclaringType, Level level, Object message, Exception exception)

不完全确定如何解决这个问题?

我已经读过,对于后台线程,您可以设置 IsBackground=true 并将销毁工作人员,但对我来说,这似乎是在 hangfire 子系统中进行管理。

我更关心从 log4net 修复它或以不同的方式编写方法。请注意,这是测试项目,但在真实环境中我不会直接调用 log4net,它将被包装在 LoggingService 中。对于这个测试,我只是想保持简单。除非我别无选择。

4

1 回答 1

2

我想出解决办法。所以最初,Hangfire 表和日志表与系统中的表一起在同一个数据库中。我注意到在几次测试中我会遇到连接字符串池错误。我并没有真正担心测试代码中的这一点,因为它简化了架构的简化版本。无论如何,我的测试旨在敲击数据库以模拟数百万笔交易。在这个测试中,我意识到为了减轻一些锤击,我应该将hangfire移动到它的数据库上,这将节省连接字符串并移动一些数据库工作,同时我也可以将日志记录移动到它的数据库,这将再次将连接字符串保存在池中。

我说我偶然发现了这一点,因为当我决定这样做时,我并没有考虑记录。因此,当我再次运行我的测试代码时,我决定取消注释我在hangfire 执行的方法中的直接日志记录,它按照我最初提出问题时的预期方式工作。

长话短说,请记住连接字​​符串在不同的线程上运行,将 DB 分开会带来隐藏的线程优势。这是一个非常简单的测试应用程序,而不是我将在生产中运行的代码,但我也不会在那里遇到同样的问题。很快就会发现,因为真正的架构开发几乎已经准备好进行测试。

于 2015-09-28T13:22:20.240 回答