2010-12-03 4 views
8

Unsere Protokolle melden ThreadAbortException s, die unsere Quartz.NET-Jobs in scheinbar zufälligen Intervallen stoppen. Soweit ich weiß, würde dies normalerweise nicht durch etwas verursacht werden, das der Thread selbst tut (z. B. Lesen einer Datei von einem FTP-Server oder Ausführen einer LINQ to Entities-Abfrage), sondern weil ein äußerer Prozess dem Thread sagt, dass er aufhören soll . Außerdem führt die Art und Weise, wie die Logs erstellt werden, zu der Annahme, dass die gesamte Webanwendung neu gestartet wird, wenn diese Fehler auftreten. Daher vermute ich, dass der Neustartprozess dazu führt, dass der Thread überhaupt abgebrochen wird.Wie kann ich herausfinden, warum mein Thread in ASP.NET gestoppt wird?

Also meine Frage ist: Wie kann ich herausfinden, warum der Server/Anwendung neu gestartet wird? Gibt es irgendwo Protokolle, die mir bei jedem Neustart Details geben würden? Gibt es gemeinsame Ursachen für so etwas, das ich untersuchen sollte?

Vielen Dank im Voraus für Ihre Hilfe.

bearbeiten

Ich hatte gerade ein Gespräch mit einigen Kollegen, und es klingt wie automatisch IIS die Anwendung setzt nach einer gewissen Zeit der Inaktivität in den Schlaf, die einen Teil des Problems sein könnten. Mit einigen Nachforschungen habe ich eine Einstellung für "Idle Timeout" für Worker-Threads in IIS gefunden. Ich denke, wenn die Anwendung für einen bestimmten Zeitraum keine Anforderungen bearbeitet hat, gibt sie einen Befehl zum Herunterfahren aus. Aus irgendeinem Grund wird Quartz nicht sofort heruntergefahren, sondern wartet darauf, dass der nächste Job ausgelöst wird, und dann erkennt das System den Thread des Jobs und tötet ihn, während er versucht, ausgeführt zu werden.

Also ich denke, wir müssen einen Weg finden, um alle laufenden Jobs anmutig zu beenden, wenn das System herunterfahren will, und Quartz tatsächlich heruntergefahren, wenn es gesagt wird, wenn es keine Aufträge ausführt. Hat jemand Erfahrung mit dieser Art von Problem?

+0

Durchforschen Sie Response.Redirects in Ihrem Code? –

+0

Nein, dies geschieht nicht während einer Anfrage. Es passiert als Teil eines Quarz-Jobs. – StriplingWarrior

+0

Hi StriplingWarrior, Wir haben genau die gleichen Probleme, die Sie beschreiben. Wenn der ApplicationPool die Quartz-Jobs erneut verarbeitet, erhalten sie eine ThreadAbortException, und nach dem zweiten Recycling laufen die .net-Quarzjobs nicht mehr. Haben Sie die Probleme gelöst? Wenn ja, würde ich mich freuen, wenn Sie kurz beschreiben könnten, wie. Vielen Dank im Voraus, Enric –

Antwort

4

Wie liho1eye sagte, entstand das Problem aus dem Anwendungspool, der unsere Anwendung herunterfährt. Aus irgendeinem Grund wurde Quartz offenbar nicht sofort stillgelegt.Stattdessen hat es gewartet, bis der nächste Job ausgeführt und dann heruntergefahren wurde, was bedeutete, dass der laufende Job über ThreadAbordException heruntergefahren werden musste.

Unsere Lösung war zweifach. Zuerst haben wir Quartz auf eine neuere Version aktualisiert, die es scheinbar ein wenig besser aussehen ließ. Zweitens haben wir in unserer Application_End-Methode in Global.asax.cs einen Aufruf an Scheduler.Shutdown(true) hinzugefügt. Dies weist den Scheduler an, das Auslösen weiterer Trigger zu stoppen, und wartet dann, bis alle derzeit ausgeführten Trigger abgeschlossen sind, bevor die Anwendung beendet wird.

+0

Warum haben Sie die Idle-Timeout-Funktion in iis nicht deaktiviert? –

+0

@Bongo Sharp: Wir betreiben mehrere Web-Anwendungen von der gleichen Maschine mit unterschiedlichen Nutzungsmengen. Daher ist es hilfreich, das App-Pool-Recycling zuzulassen. – StriplingWarrior

1

Wenn Sie in Ihrem Code Umleitungen durchführen, ohne den endReponse-Parameter von Response.Redirect anzugeben, ruft die Umleitung thread.Abort() auf, aber es wird weiterhin Code zur Ausführung vorhanden sein. Dieser Code wird verwaist, da der Thread weg ist und Sie die Ausnahme erhalten. Zum Lesen:

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

Edit:
Eine andere Möglichkeit wäre eine nicht behandelte Serverebene Ausnahme, dass causes the w3wp.exe process to crash or recycle itself sein. Dies wäre der externe Grund, auf den Sie hingewiesen haben, der dazu führen würde, dass der Thread abbricht, aber versucht, den Code weiter auszuführen. Um festzustellen, ob dies der Fall sein könnte, würden Sie Ausnahmen in Ihrem Systemereignisprotokoll haben. Sie sind sehr generisch, aber sie werden w3wp.exe klar auflisten (damit Sie das als Filter verwenden können). Wenn dies der Fall ist, müssen Sie IIS Debug Diagnostics installieren und einige Absturzüberwachungen einrichten, um festzustellen, was im Moment des Absturzes passiert. Da dies außerhalb des eigentlichen Seitenlebenszyklus geschieht, wird die normale Ausnahmebehandlung umgangen.

+0

Dies wird nur einen Anfragethread abbrechen. Meine Abbrüche finden auf einem Quartz.NET-Thread statt. – StriplingWarrior

+0

@StriplingWarrior - Ich habe eine andere Idee. Ich werde eine Bearbeitung bereitstellen. –

1

Das bedeutet natürlich, dass irgendwo irgendwo Thread.Abort() auf der Instanz Ihres Job-Threads genannt wird. Ich würde auf diese Quarz-Sache zur Erklärung schauen.

Eine andere Möglichkeit ist, dass Ihr Job-Thread ein Hintergrund-Thread ist und Ihr App-Pool recycelt wird, aber ich würde alles über diese Quartz-Sache sicher wissen.

+0

Quartz ist nur ein Jobplaner, der bestimmte Jobs in Hintergrundthreads nach einem Zeitplan ausführt. – StriplingWarrior

+1

Also läuft es in Ihrem Web App Pool? Nun, da ist dein Problem - App-Pool-Recycling. –

Verwandte Themen