2010-12-03 7 views
8

ログは、無作為な間隔でQuartz.NETジョブを停止させているThreadAbortExceptionを報告しています。私が理解するところでは、これは通常、スレッド自体が行っていること(FTPサーバーからファイルを読み込む、またはLINQ to Entitiesクエリを実行するなど)によって引き起こされるのではなく、一部の外部プロセスがスレッドに停止を指示している。さらに、ログの作成方法によって、私たちはこれらのエラーが発生したときにWebアプリケーション全体が再起動されていると考えているので、再起動プロセスがスレッドを最初に中断させる原因になっていると推測しています。ASP.NETでスレッドが停止している理由を知るにはどうすればよいですか?

私の質問は、どのようにサーバー/アプリケーションが再起動されているのかわかりますか?どこかで再起動するたびに詳細がわかるログがありますか?私が調査すべきこのようなものに共通の原因はありますか?

ご協力いただきありがとうございます。

編集

私はいくつかの同僚との議論があったが、IISが自動的に問題の一部である可能性があります非アクティブの一定期間、後にスリープ状態にアプリケーションを置くように聞こえます。いくつかの調査で、IISのワーカースレッドの「アイドルタイムアウト」設定が見つかりました。私は、アプリケーションが一定時間要求を処理しなかったときに、シャットダウンコマンドを発行すると思います。何らかの理由でQuartzがすぐにシャットダウンするのではなく、次のジョブが起動するのを待ってから、システムはそのジョブのスレッドを検出し、実行しようとしている間にジョブを停止させます。

システムをシャットダウンするときに実行中のジョブを正常に終了させ、何も実行していない場合はQuartzを実際にシャットダウンするようにする必要があると思います。誰かがこの種の問題を経験しているのでしょうか?

+0

Response.Redirectsをコードに使用していますか? –

+0

いいえ、これはリクエスト中に起こっていません。これは、Quartzの仕事の一環として起こっています。 – StriplingWarrior

+0

こんにちはStriplingWarrior、 あなたと同じ問題が発生しています。 ApplicationPoolがquartzをリサイクルすると、.netジョブはThreadAbortExceptionを受け取り、2回目のリサイクル後にquartz .netジョブはもう実行されません。 問題を解決しましたか?もしそうなら、私はあなたが簡単にどのように記述できるか分かります。 ありがとうございます。 エンリケ –

答えて

4

liho1eyeが指摘したように、この問題は、アプリケーションプールがアプリケーションをシャットダウンすることによって発生しました。何らかの理由で、Quartzは明らかにすぐにシャットダウンしていませんでした。代わりに、次のジョブが実行されてシャットダウンするまで待っていました。つまり、実行中のジョブをThreadAbordException経由でシャットダウンする必要がありました。

これに対する我々の解決策は2倍であった。最初に、Quartzをより最近のバージョンに更新しました。これは、動作が少し良くなるように思えました。次に、Global.asax.csのApplication_Endメソッドで、Scheduler.Shutdown(true)への呼び出しを追加しました。これは、スケジューラに追加のトリガーの発射を停止するように指示し、アプリケーションの終了を許可する前に、現在実行中のすべてのトリガーが完了するまで待機します。

+0

iisでアイドルタイムアウトを無効にしたのはなぜですか? –

+0

@Bongo Sharp:私たちは、さまざまな使用量で、同じマシンから複数のWebアプリケーションを実行しています。したがって、アプリプールのリサイクルを許可すると便利です。 – StriplingWarrior

1

Response.RedirectのendReponseパラメータを指定せずにコード内でリダイレクトを実行すると、リダイレクトではthread.Abort()が呼び出されますが、コードは実行されます。このコードは、スレッドがなくなって例外が発生するため、孤立してしまいます。読書のための:

http://www.c6software.com/articles/ThreadAbortException.aspx

編集:
別の可能性は、未処理のサーバーレベル例外causes the w3wp.exe process to crash or recycle itselfことだろう。これは、スレッドが中止するが、コードの実行を継続しようとすると思われる外部の原因となります。これが当てはまるかどうかを判断するには、システムイベントログに例外があります。それらは非常に一般的ですが、w3wp.exeを明示的にリストする(フィルタとして使用することができます)。これが当てはまる場合は、IIS Debug Diagnosticsをインストールし、クラッシュの瞬間に何が起きているのかを把握するためにいくつかのクラッシュモニタを設定する必要があります。実際のページライフサイクルの外で発生するため、通常の例外処理はバイパスされます。

+0

これは、要求スレッドのみを中止します。私の中止はQuartz.NETスレッド上で行われています。 – StriplingWarrior

+0

@StriplingWarrior - 私は別の考えがあります。私は編集を提供します。 –

1

当然これは、あなたのジョブスレッドのインスタンス上でThread.Abort()をどこかに呼び出したことを意味します。私は説明のためにこのクォーツに向かって考えます。

あなたのジョブスレッドはバックグラウンドスレッドであり、アプリケーションプールはリサイクルされている可能性がありますが、私は確かにこのQuartzについて知っています。

+0

Quartzはスケジューラのバックグラウンドスレッドで特定のジョブを実行する単なるジョブスケジューラです。 – StriplingWarrior

+1

それはあなたのWebアプリケーションプール内で実行されますか?さてあなたの問題があります - アプリケーションプールのリサイクル。 –

関連する問題