我使用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并且会破坏worker,但对我来说这似乎是在hangfire子系统中进行管理。
我更关心的是从log4net修复它或以不同方式编写方法。在那个注释中,这是测试项目,但在真实环境中我不会直接调用log4net,它将被包装在LoggingService中。对于这个测试,我只是想保持简单。除非我别无选择。
答案 0 :(得分:1)
我认为这可以解决其他问题。所以最初,Hangfire表和日志表与系统中的表一起位于同一个数据库中。我注意到在测试中几次我会遇到连接字符串池错误。我从测试代码中并没有真正担心这一点,因为它简化了将要使用的架构版本。无论如何,我的测试旨在锤击数据库以模拟数百万的交易。在这个测试中,我意识到要减轻一些锤击,我应该将hangfire移动到它的DB上,这将节省连接串并移动一些数据库工作,同时这样做我也可以将日志记录移动到它的DB,这将再次保存池中的连接字符串。
我说我偶然发现了这一点,因为当我决定这样做的时候我并没有考虑记录。因此,当我再次运行我的测试代码时,我决定取消注释我直接登录hangfire执行的方法,并且当我提出问题时,它按照我原来打算的方式工作。
长话短说,请记住连接字符串在不同的线程上运行,分离DB会给隐藏线程带来优势。这是一个非常simeple测试应用程序,而不是我将在生产中运行的代码,而不是我能在那里遇到同样的问题。随着真正的拱形开发几乎准备好进行测试,很快就会发现。