Eksemplene så langt har vist enkel jobbopprettelse, planlegging og fremdriftsrapportering. Mekanismen for jobbplanlegging er faktisk mer kraftfull enn vi har sett hittil. Du får mer detaljert kontroll over måten jobben er planlagt på ved å bruke prioriteter, forsinkelser og tilpassede planleggingsbetingelser.
En jobbprioritet kan brukes til å angi hvor viktig en jobb er i forhold til andre jobber i systemet. Det å angi prioritet for en jobb har ingen innvirkning på jobber som allerede kjører, men virker derimot inn på planleggingen av en ventende jobb i forhold til andre jobber. Prioriteten for en jobb kan være en av flere forhåndsdefinerte prioritetskonstanter:
Standardprioriteten for en jobb er LONG. Følgende snutt oppretter den enkle jobben vi brukte tidligere, men definerer prioriteten DECORATE og angir dermed at det er det laveste prioritetsnivået.
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
En annen måte å styre jobbplanleggingen på, er gjennom bruk av planleggingsforsinkelse. En planleggingsforsinkelse kan angis når jobben planlegges. Jobben forsinkes med det angitte antallet millisekund før den planlegges.
TrivialJob job = new TrivialJob(); job.schedule(1000); // wait one second before scheduling
Det har ingen hensikt å planlegge en jobb som allerede venter eller er i sovetid. Men hvis du planlegger en jobb som allerede kjører, vil den bli planlagt på nytt etter at den er ferdig. Dette er en praktisk mekanisme for gjentakende jobber, for eksempel avspørringssløyfer i bakgrunnen. Hvis jobben planlegges på nytt flere ganger mens den kjøres, vil den bare bli planlagt på nytt en eneste gang med den forsinkelsen som er angitt sist. Følgende snutt definerer en jobb som planlegger seg selv på nytt slik at den kjøres ti sekunder etter at den gjeldende gjentakelsen er fullført.
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; } }
Ved hjelp av ytterligere protokoll i Job-klassen kan en jobb søke etter forhåndsbetingelser like før den planlegges eller kjøres. Dette ser vi best gjennom et eksempel:
class JobWithPreconditions extends Job { ... public boolean shouldSchedule() { return super.shouldSchedule() && checkJobPreconditions(); } public boolean shouldRun() { return super.shouldRun() && checkJobPreconditions(); } ... }
Metoden shouldSchedule kalles like før jobbstyreren legger jobben i køen. Dette gjør det mulig for jobben å avbryte seg selv hvis de grunnleggende forhåndsbetingelsene for planlegging ikke er oppfylt. Jobben returnerer false hvis det ikke er hensiktsmessig å planlegge den. På samme måte kalles metoden shouldRun like før jobbstyreren kjører jobben. Alle ytterligere vilkår som skal oppfylles før jobben kjøres, må nå kontrolleres.