Die bisherigen Beispiele haben eine einfache Joberstellung, Zeitplanung und Fortschrittsberichte dargestellt. Der Mechanismus der Jobterminierung ist tatsächlich deutlich leistungsfähiger als bisher dargestellt. Er verwendet Prioritätsstufen, Verzögerungen und angepasste Terminierungsbedingungen, um Ihnen eine differenzierte Steuerung der Planung eines Jobs zu ermöglichen.
Über eine Jobpriorität kann die Wichtigkeit eines Jobs im Verhältnis zu anderen Jobs im System bestimmt werden. Ein laufender Job wird von der Prioritätsbestimmung nicht beeinflusst. Wartende Jobs hingegen sind in Bezug auf Ihre Zeitplanung im Verhältnis zu anderen Jobs betroffen. Die Priorität eines Jobs kann einen von mehreren vordefinierten Prioritätskonstanten annehmen:
Die Standardpriorität eines Jobs ist LONG. Der folgende Ausschnitt erstellt den bereits zuvor verwendeten trivialen Job, setzt aber die Priorität auf DECORATE, um anzuzeigen, dass es er die niedrigste Priorität hat.
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Eine andere Methode zur Steuerung der Planung eines Jobs ist die Verwendung einer Terminierungsverzögerung. Eine Terminierungsverzögerung kann im Rahmen der Zeitplanung eines Jobs angegeben werden. Der Job wird um die angegebene Anzahl an Millisekunden verzögert, bevor er terminiert wird.
TrivialJob job = new TrivialJob(); job.schedule(1000); // wait one second before scheduling
Die Terminierung eines Jobs, der bereits wartet oder inaktiv ist, hat keinerlei Effekt. Wenn allerdings ein Job terminiert wird, der momentan ausgeführt wird, so wird er nach Beendigung erneut terminiert. Dies ist ein praktischer Mechanismus für Jobs, die (wie beispielsweise Sendeaufrufschleifen im Hintergrund) regelmäßig ausgeführt werden müssen. Wenn ein Job während der Ausführung mehrfach neu terminiert wird, so wird er nur einmal neu terminiert, und verwendet die letzte verwendete Verzögerung. Der folgende Ausschnitt definiert einen Job, der sich selbst neu terminiert, so dass er 10 Sekunden nach Beendigung der aktuellen Iteration erneut ausgeführt wird.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Running the job."); // reschedule after 10 seconds schedule(10000); return Status.OK_STATUS; } }
Über ein zusätzliches Protokoll in der Klasse Job kann ein Job direkt vor seiner Terminierung oder Ausführung nach Voraussetzungen suchen. Dies wird im folgenden Beispiel dargestellt:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
Die Methode shouldSchedule wird aufgerufen, direkt bevor der Job-Manager den Job in die Warteschleife einreiht. Hierdurch kann der Job selbst einen Abbruch einleiten, wenn Grundvoraussetzung für die Terminierung nicht erfüllt werden. Der Job sollte den Wert false zurückgeben, wenn er für eine Terminierung nicht geeignet ist. Auf die gleiche Art wird die Methode shouldRun aufgerufen, direkt bevor der Job-Manager den Job ausführt. An dieser Stelle können mögliche weitere Bedingungen überprüft werden, die vor Ausführung des Jobs erfüllt sein müssen.