Tot nu toe hebt u in de voorbeelden gezien hoe u eenvoudige jobs maakt, de planning opstelt en de voortgang meldt. Het mechanisme voor jobplanning is echter veel krachtiger. U kunt de manier waarop de job gepland is gedetailleerder beheren door prioriteiten, uitstel en aangepaste planningsvoorwaarden te gebruiken.
Een jobprioriteit wordt gebruikt om het belang van een job ten opzichte van andere jobs in het systeem aan te geven. Het instellen van een prioriteit heeft geen effect op een job die al wordt uitgevoerd, maar wel op hoe een wachtende job ten opzichte van andere jobs wordt gepland. De prioriteit van een job wordt aangegeven met een aantal vooraf gedefinieerde constanten:
De standaardprioriteit voor een job is LONG. In het volgende codefragment wordt een willekeurige job gemaakt, die u eerder hebt gezien, maar nu met de prioriteit DECORATE om aan te geven dat de prioriteit van het laagste niveau is:
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Een andere techniek om te bepalen hoe een job wordt gepland is het gebruik van een planningsvertraging. U kunt een planningsvertraging opgeven als de job wordt gepland. De job wordt een opgegeven aantal milliseconden uitgesteld voordat deze wordt gepland.
TrivialJob job = new TrivialJob(); job.schedule(1000); // 1 seconde wachten voor het plannen
Het plannen van een job die al staat te wachten, heeft geen effect. Als een taak echter al wordt uitgevoerd, wordt deze na voltooiing opnieuw gepland. Dit is een nuttig mechanisme voor herhaalde jobs, zoals pollinglussen op de achtergrond. Als de taak meerdere malen opnieuw wordt gepland terwijl hij wordt uitgevoerd, wordt de planning met de recentste vertraging gebruikt. In het volgende codefragment wordt een job gedefinieerd die zichzelf opnieuw plant zodat hij tien seconden wordt uitgevoerd na voltooiing van de huidige herhaling.
class RepetitiveTrivialJob extends Job { public RepetitiveTrivialJob() { super("Repetitive Trivial Job"); } public IStatus run(IProgressMonitor monitor) { System.out.println("Running the job."); // opnieuw plannen na 10 seconden schedule(10000); return Status.OK_STATUS; } }
Met een aanvullend protocol in de klasse Job kan een job voorwaarden ophalen voordat deze wordt gepland of uitgevoerd. Dit is het best te begrijpen aan de hand van een voorbeeld:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
De methode shouldSchedule wordt aangeroepen voordat de jobmanager de job in de wachtrij plaatst. Hierdoor kan de job zichzelf annuleren als niet is voldaan aan bepaalde basisvoorwaarden voor de planning. De job moet false retourneren als deze niet kan worden gepland. De methode shouldRun wordt aangeroepen voordat de jobmanager de job uitvoert. Eventuele extra voorwaarden waaraan voldaan moet worden voordat de job wordt uitgevoerd, moeten op dit moment worden gecontroleerd.