2012-05-05 3 views
12

Ich bin sehr neu in Quarz und ich habe einige Zweifel über den Joblebenszyklus.Wenn ein Quarzjob ausgelöst wird, handelt es sich um eine neue Jobklasseninstanz?

Nehmen wir an, ich habe einen einzelnen Job konfiguriert, um etwas zu tun.

Der Job wird ausgelöst und seine Arbeit beendet. Wenn es erneut ausgelöst wird, handelt es sich um die gleiche Instanz (vom Scheduler möglicherweise aktiviert und deaktiviert) oder um eine neue Jobinstanz (sobald der Job beendet wird, wird er beendet und wenn die Triggerbedingung erfüllt ist, wird eine neue Jobinstanz erstellt) ?

Ich frage diese Frage, denn wenn ich meine Anwendung debuggen (Frühjahr 3 mvc mit Quarz-Unterstützung) sehe ich neue Instanzen des Jobs und neue Threads mit SimpleThreadPool $ WorkerThreadRun() geöffnet für jedes Mal, wenn der Job ausgelöst wird, so dass der SimpleThreadPool $ WorkerThreadRun() - Threads werden angehäuft und nie beendet.

Ich will nur wissen, ob dieses Verhalten allright ist oder ich bin verpflichtet, den Speicher zu füllen ;-)

Kann mir jemand eine Erklärung geben? Danke im Voraus.

Antwort

15

Quartz erstellt jedes Mal eine neue Instanz Ihrer Jobklasse, wenn dieser Job ausgelöst werden soll. Angenommen, Sie haben geplant, dass Hunderttausende von Jobs sehr selten ausgelöst werden - es wäre eine Verschwendung von Speicher, all diese Jobs im Speicher zu behalten.

Wenn Sie jedoch Spring support for Quartz, insbesondere die MethodInvokingJobDetailFactoryBean verwenden, wird Spring den Lebenszyklus Ihres Jobs behandeln (es ruft grundsätzlich die angegebene Methode einer Ihrer Beans auf). Aber das scheint in Ihrer Bewerbung nicht der Fall zu sein.

Natürlich, nachdem der Job fertig ist und keine anderen Referenzen darauf zeigen (was der Normalfall ist), wird Garbage Collector schließlich den vom Job belegten Speicher freisetzen.

Schließlich über Threads - Quartz erstellt einen festen Pool von Worker-Threads (siehe org.quartz.threadPool.threadCount Konfigurationsoption). Jedes Mal, wenn Sie einen Job ausführen, entscheidet sich Quartz möglicherweise dafür, einen anderen Thread zu verwenden. Es wird jedoch nicht für jeden Trigger ein neuer Thread erstellt.

+0

Vielen Dank. Deine Erklärung ist einfach und klar und das habe ich wirklich gebraucht! Tatsächlich benutze ich in meiner Anwendung 'JobDetailBean',' CronTriggerBean' und 'SchedulerFactoryBean', aber wenn ich deine Antwort lese, nehme ich an, dass der Lebenszyklus auch vom Frühling gehandhabt wird, ohne die Gefahr von Speicherfehlern. Thnks wieder. – MaVVamaldo

+0

Über "MethodInvokingJobDetailFactoryBean". Spring behandelt den Lebenszyklus Ihrer ** Bean ** und die Methode dieser Bean wird von Quartz-job aufgerufen (implementiert die "org.quartz.Job" -Schnittstelle, Kind der abstrakten Klasse "QuartzJobBean" im Frühjahr). Und diese Quartz-Job-Instanz wird wie in meiner Antwort beschrieben erstellt. –

+0

Hallo @tomasz, könntest du mir bitte sagen, wie man die doIt() Methode (zB von Spring docs) beim Klick auf eine Taste von JSP aufruft. Ich verwende Quartz-Job, aber meine execute() -Methode meiner Job-Klasse wird nicht aufgerufen.Ich benutze MethodInvokingJobDetailFactoryBean mit einigen Triggern und JobDetails mit SchedulerFactoryBean, aber sie werden bei einigen Fixzeitintervallen nicht bei Bedarf aufgerufen. Vielen Dank – Jaikrat

3

Ich werde über Version 2.1.5 (neueste Version) schreiben, aber es könnte auch für andere Versionen gelten.

Job -Instanz erstellt von einer Instanz von "JobFactory" mit "newJob" -Funktion (zB SimpleJobFactory). Call to "newJob" ausgeführt in der "initialize" -Methode von JobRunShell -klasse. JobRunShell -Objekt wird in der lokalen Variablen "QuartzSchedulerThread .run" gehalten und nicht in einer anderen Liste oder einem anderen Feld gespeichert.

So, neue Job -Instanz für jede Triggerzeit erstellt und nach der Ausführung wird es normalerweise von Garbage Collector aufgeräumt werden.

Verwandte Themen