3

ハングファイア、繰り返しタスクでプロセスを実行しています。これらのタスクは毎分開始され、DB から数千行を処理するように設定されています。

これらのメソッド内に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 を設定してワーカーを破棄できることを読みましたが、それはハングファイア サブシステムで管理するように思えます。

log4netから修正するか、メソッドを別の方法で記述することにもっと関心があります。これはテスト プロジェクトですが、実際の環境では log4net を直接呼び出すのではなく、LoggingService にラップされます。このテストでは、単純にしようとしています。仕方がない限り。

4

1 に答える 1

2

私はこれが他の何かを解決することを理解しました。そのため、当初、Hangfire テーブルとログ テーブルは、システムのテーブルと共に同じデータベースにありました。数回のテストで、接続文字列のプール エラーが発生することに気付きました。テストコードからこれについてはあまり心配していませんでした。これは、実装されるアーキテクチャの単純化されたバージョンであるためです。とにかく、私のテストは、DB を叩いて数百万のトランザクションをシミュレートすることを目的としています。このテストでは、ハングファイアをそのデータベースに移動する必要があることを軽減するために、接続文字列を節約し、そのデータベースの作業の一部を移動する必要があることに気付きました。これにより、接続文字列がプールに保存されます。

これをやろうと決めたとき、ロギングについて考えていなかったので、これに出くわしたと言います。そのため、テスト コードを再度実行したときに、hangfire が実行するメソッドの直接ログのコメントを解除することにしました。

簡単に言えば、接続文字列は異なるスレッドで実行されることを覚えておいてください。DB を分離すると、隠れたスレッドの利点が得られます。これは非常に単純なテスト アプリケーションであり、本番環境で実行するコードではありませんが、それでも同じ問題が発生する可能性があります。実際のアーチ開発はテストの準備がほぼ整っているため、すぐにわかります。

于 2015-09-28T13:22:20.240 に答える