Our examples so far have demonstrated simple job creation, scheduling, and progress reporting. The job scheduling mechanism is actually more powerful than we've shown so far. You can have more fine-grained control over the way your job is scheduled by using priorities, delays, and custom scheduling conditions.
A job priority can be used to establish the importance of a job relative to other jobs in the system. Setting the priority of a job won't affect a job that is already running, but it will affect how a waiting job is scheduled relative to other jobs. The priority of a job can be one of several pre-defined priority constants:
TrivialJob job = new TrivialJob(); job.setPriority(Job.DECORATE); job.schedule();
Another technique for controlling how a job is scheduled is to use a scheduling delay. A scheduling delay
can be specified when the job is scheduled. The job will be delayed for the specified number of milliseconds
before it is scheduled.
TrivialJob job = new TrivialJob();
job.schedule(1000); // wait one second before scheduling
Scheduling a job that is already waiting or is sleeping has no effect. However, scheduling a job that is
already running will cause it to be rescheduled after it is finished. This is a convenient mechanism for
repetitive jobs such as background polling loops. If the job is rescheduled multiple
times while it is running, it will only be rescheduled once with the most recently supplied delay. The
following snippet defines a job that reschedules itself to run 10 seconds after it finishes the
current iteration.
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;
}
}
Additional protocol in the Job class
allows a job to check for preconditions just before it is scheduled or run. This is best demonstrated by example:
class JobWithPreconditions extends Job {
...
public boolean shouldSchedule() {
return super.shouldSchedule() && checkJobPreconditions();
}
public boolean shouldRun() {
return super.shouldRun() && checkJobPreconditions();
}
...
}
The shouldSchedule method is called just before the job manager places the job in the queue. This allows the job
to cancel itself if basic preconditions for scheduling are not met. The job should return false it
is inappropriate to schedule it. Likewise, the shouldRun method is called just before the job manager
runs the job. Any additional conditions that must be met before the job is run must be checked at this time.