Planificación de trabajos

Hasta ahora, los ejemplos han mostrado los procesos simples de creación de trabajos, planificación e informe de progreso. En realidad, el mecanismo de planificación de trabajos es más potente que lo que se ha mostrado hasta ahora. Puede tener un control más detallado sobre la forma en que se planifican los trabajos mediante la utilización de prioridades, retardos y condiciones de planificación personalizadas.

Prioridades de trabajo

Una prioridad de trabajo puede utilizarse para establecer la importancia de un trabajo en relación a otros trabajos del sistema. El hecho de establecer la prioridad de un trabajo no afectará a los trabajos que ya se estén ejecutando, pero sí afectará a cómo se planifica un trabajo en espera en relación a otros trabajos. La prioridad de un trabajo puede ser una de las diversas constantes de prioridad predefinidas:

La prioridad por omisión de un trabajo es LONG. El siguiente fragmento de código crea el trabajo trivial que hemos utilizado anteriormente, pero establece la prioridad en DECORATE para indicar que tiene la prioridad de ejecución más baja:

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

Planificar con retardo

Otra técnica para controlar cómo se planifica un trabajo consiste en utilizar un retardo de planificación. El retardo de planificación puede especificarse cuando se planifica el trabajo. El trabajo se retardará durante el número de milisegundos especificado antes de planificarse.

      TrivialJob job = new TrivialJob();
   job.schedule(1000);  // esperar un segundo antes de planificar

Replanificar un trabajo

La planificación de un trabajo que ya esté en espera o en latencia no tiene ningún efecto. Sin embargo, la planificación de un trabajo que se esté ejecutando provocará que se vuelva a planificar una vez finalizado. Este es un mecanismo adecuado para trabajos repetitivos, como por ejemplo los bucles de sondeo en segundo plano. Si el trabajo se replanifica varias veces mientras está en ejecución, sólo se replanificará una vez con el retardo más reciente especificado. El siguiente fragmento de código define un trabajo que se replanifica para ejecutarse 10 segundos después de haber finalizado la iteración actual.

      class RepetitiveTrivialJob extends Job {
      public RepetitiveTrivialJob() {
         super("Trabajo trivial repetitivo");
      }
      public IStatus run(IProgressMonitor monitor) {
         System.out.println("Ejecutando el trabajo.");
         // replanificar después de 10 segundos
         schedule(10000);
         return Status.OK_STATUS;
      }
   }

Condiciones de planificación personalizadas

Un protocolo adicional de la clase Job class permite que un trabajo compruebe si existen precondiciones inmediatamente antes de que se planifique o ejecute. Lo mostraremos mediante un ejemplo:

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

Se llama al método shouldSchedule inmediatamente antes de que el gestor de trabajos coloque el trabajo en la cola. Esto permite al trabajo cancelarse a sí mismo si no se cumplen precondiciones básicas para la planificación. El trabajo debe devolver false si es inapropiado para planificarlo. Del mismo modo, se llama al método shouldRun inmediatamente antes de que el gestor de trabajos ejecute el trabajo. Las condiciones adicionales que deben cumplirse antes de ejecutar el trabajo deben comprobarse en este momento.