Dies sollte wirklich einfach sein. Ich benutze Quartz läuft unter Apache Tomcat 6.0.18, und ich habe eine jobs.xml file, die meinen geplanten Job eingerichtet, die jede Minute ausgeführt wird.quartz: gleichzeitige Instanzen eines Jobs in jobs.xml verhindern
Was ich tun möchte, ist, wenn der Job noch läuft, wenn die nächste Triggerzeit rollt, will ich keinen neuen Job starten, damit ich die alte Instanz abschließen kann.
Gibt es eine Möglichkeit, dies in jobs.xml anzugeben (gleichzeitige Instanzen zu verhindern)?
Wenn nicht, gibt es eine Möglichkeit, den Zugriff auf ein In-Memory-Singleton innerhalb der Job Implementierung meiner Anwendung zu teilen (ist dies durch die JobExecutionContext?), So dass ich die Nebenläufigkeit selbst behandeln kann? (Und erkennen, ob eine vorherige Instanz läuft)
Update: Nach zappelte um in der Dokumentation, hier ein paar Ansätze, die ich bin am überlegen, aber entweder nicht wissen, wie sie an die Arbeit, oder es gibt Probleme.
Verwenden Sie StatefulJob. Dies verhindert den gleichzeitigen Zugriff ... aber ich bin nicht sicher, welche anderen Nebenwirkungen auftreten würden, wenn ich es benutze, auch möchte ich die folgende Situation vermeiden:
Angenommen, die Triggerzeiten würden jede Minute sein, dh Trigger # 0 = zum Zeitpunkt 0, Auslöser # 1 = 60000 ms, # 2 = 120000, # 3 = 180000 usw. und der Auslöser # 0 zum Zeitpunkt 0 löst meinen Job aus, der 130000 ms benötigt. Bei einem einfachen Job würde dies die Trigger # 1 und # 2 ausführen, während der Job-Trigger # 0 noch läuft. Mit einem StatefulJob würde dies die Trigger # 1 und # 2 in der Reihenfolge ausführen, unmittelbar nachdem # 0 bei 130000 endet. Ich möchte das nicht, ich möchte # 1 und # 2 nicht ausführen und der nächste Trigger, der einen Job ausführt, sollte stattfinden bei # 3 (180000msec). Ich muss also noch etwas anderes mit StatefulJob tun, damit es so funktioniert, wie ich es möchte. Daher sehe ich keinen großen Vorteil darin, es zu benutzen.
Verwenden Sie eine TriggerListener, um von vetoJobExecution() den Wert true zurückzugeben.
Obwohl die Implementierung der Schnittstelle einfach scheint, muss ich herausfinden, wie man eine Instanz eines TriggerListener deklarativ aufbaut. Can't find the docs for the xml file.
Verwenden Sie ein
static
freigegebenes Thread-sicheres Objekt (z. B. ein Semaphor oder was auch immer), das zu meiner Klasse gehört, die Job implementiert.Ich mag nicht die Idee der Verwendung von Singletons über das Schlüsselwort
static
unter Tomcat/Quarz, nicht sicher, ob es Nebenwirkungen gibt. Ich will auch nicht, dass sie echte Singletons sind, nur etwas, das mit einer bestimmten Jobdefinition in Verbindung gebracht wird.Implementieren Sie meine eigenen Trigger, die erweitert und Shared-Status enthält, die einen eigenen TriggerListener ausführen könnte.
Noch einmal, ich weiß nicht, wie Sie die XML-Datei für die Verwendung dieses Triggers anstelle des Standards
<trigger><simple>...</simple></trigger>
einrichten.
In neueren Versionen von Quarz, Kennzeichnung der Klasse Umsetzung Job mit @DisallowConcurrentExecution stellt sicher, dass nur eine Klasse jederzeit läuft ... – sbrattla