Schemaläggning av jobb

I våra exempel hittills har vi visat hur man skapar enkla jobb, schemaläggning och förloppsrapportering. Mekanismen för schemaläggning av jobb är i själva verket ännu kraftfullare än vad vi redan har sett. Du kan använda en mer detaljerad styrning över hur jobbet schemaläggs genom att använda prioriteter, fördröjningar och anpassade schemaläggningsvillkor.

Jobbprioriteter

En prioritet för ett jobb kan användas till att ange vikten av ett jobb i förhållande till andra jobb i systemet. När du anger prioritet för ett jobb påverkar det inte jobb som redan körs, men det påverkar hur väntande jobb schemaläggs i förhållande till andra jobb. Prioriteten för ett jobb kan vara någon av flera fördefinierade prioritetskonstanter:

Standardprioriteten för ett jobb är LONG. I följande kodstycke skapar vi det enkla jobb vi använde tidigare, men vi anger prioriteten DECORATE och anger på så sätt den lägsta nivån av prioritet:

   TrivialJob job = new TrivialJob();
   job.setPriority(Job.DECORATE);
   job.schedule();

Schemalägga med fördröjning

Ett annat sätt att styra hur ett jobb ska schemaläggas är att använda en schemaläggningsfördröjning. En schemaläggningsfördröjning kan anges när jobbet schemaläggs. Jobbet kommer att fördröjas i ett angivet antal millisekunder innan det schemaläggs.

   TrivialJob job = new TrivialJob();
   job.schedule(1000);  // vänta en sekund före schemaläggningen

Schemalägga ett jobb på nytt

Det har ingen effekt att schemalägga ett jobb som redan väntar eller är i viloläge. Men om vi schemalägger ett jobb som redan körs kommer det att schemaläggas på nytt när det är klart. Det här är en praktisk mekanism för repetitiva jobb, till exempel pollningsslingor i bakgrunden. Om jobbet schemaläggs på nytt flera gånger medan det körs kommer det bara att schemaläggas på nytt en enda gång med den fördröjning som har angetts senast. I följande kodstycke definieras ett jobb som schemalägger sig själv på nytt så att det körs tio sekunder efter det att den aktuella iterationen är slutförd.

   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;
      }
   }

Anpassade schemaläggningsvillkor

Med hjälp av ytterligare protokoll i klassen Jobb kan ett jobb söka efter förutsättningar alldeles innan det schemaläggs eller körs. Det demonstreras bäst med ett exempel:

class JobWithPreconditions extends Job {
	...
	public boolean shouldSchedule() {
		return super.shouldSchedule() && checkJobPreconditions();
	}
	public boolean shouldRun() {
		return super.shouldRun() && checkJobPreconditions();
	}
	...
}

Metoden shouldSchedule anropas alldeles innan jobbhanteraren placerar jobbet i kön. På så sätt kan jobbet avbryta sig själv om grundförutsättningarna för schemaläggning inte är uppfyllda. Jobbet returnerar false om det inte är lämpligt att schemalägga det. På samma sätt anropas metoden shouldRun alldeles innan jobbhanteraren kör jobbet. Alla ytterligare villkor som måste vara uppfyllda innan jobbet körs måste kontrolleras vid den här tidpunkten.