Quartz con Spring II: Jobs y Triggers

Siguiendo con el post anterior Quart con Spring I: Configuración, en esta entrada veremos primero como se crea el Job con el proceso que debe ejecutarse. Después veremos como programar triggers dinámicamente desde un servicio.

Nuestro Job de ejemplo

El Job definido en el fichero quartz.xml (QuartzExample.java) sería como sigue:

package org.empresa.jobs;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
 
import org.empresa.service.INuestroService;
 
/**
 * Job de ejemplo.
 * @author alvaro.hernandez
 */
public class QuartzExample extends QuartzJobBean {
 
 // La dependencia se ha inyectado desde quartz.xml
 private INuestroService nuestroService;
 
 @Override
 public void executeInternal(JobExecutionContext context) throws JobExecutionException {
 
 nuestroService.nuestroMetodo;
 
 }
 // getter/setter
 
 public INuestroService getNuestroService() {
 return nuestroService;
 }
 
 public void setNuestroService(INuestroService nuestroService) {
 this.nuestroService = nuestroService;
 }
 
}

Aclaraciones:

  • El Job extiende QuartzJobBean en lugar de Job, es necesario para la integración con Spring.
  • La dependencia se han inyectado al incluir el servicio en el contexto del scheduler (en el fichero quartz.xml)

Programar Triggers dinámicamente

A continuación os detallo un Servicio de ejemplo al que se llamaría para programar un trigger dinámicamente:
package org.empresa.service;
 
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdScheduler;
import org.springframework.beans.factory.annotation.Autowired;
 
/**
 * Servicio de acceso al scheduler.
 * @author alvaro.hernandez
*/
public class ProgramadorTareasServiceImpl {
 
 @Autowired
 private StdScheduler nuestroScheduler;
 
 /**
 * <p>Genera el trigger Quartz para que se ejecute en la fecha/hora indicada.</p>
 */
 public void programaTarea() {
 Date fecha = new Date();
 Date fechaLimite = new Date();
 Long tiempoRepeticion = 60000;
 Long numeroRepeticiones = 5;
 Map<String, Long> parametros;
 
// ******** Creamos el trigger y guardamos el identificador de la tarea en el Trigger.JobDataMap 
 try {
 SimpleTrigger trigger = new SimpleTrigger();
 
 // Se asigna el nombre al trigger
 trigger.setName("nombreTrigger");
 // Job que se quiere lanzar
 trigger.setJobName("quartzExampleJobDetail");
 // Grupo del trigger (si no se indica se toma grupo por defecto)
 trigger.setGroup("grupoTrigger");
 // Grupo del Job (si no se indica se toma grupo por defecto)
 trigger.setJobGroup("grupoJob");
 // Si se quieren guardar datos para usarlos en la ejecución del Job,
 // se pueden guardar en un Map y guardarlos en el trigger.
 trigger.getJobDataMap().putAll(parametros); 
 // Fecha y hora de ejecución
 trigger.setStartTime(fecha);
 // Si la tarea es repetitiva, se pueden indicar:
 // 1. los milisegundos que debe transacurrir entre repetición
 // 2. La fecha límite hasta la que debe repetirse
 // 3. El número de repeticiones
 trigger.setRepeatInterval(tiempoRepeticion);
 trigger.setEndTime(fechaLimite);
 trigger.setRepeatCount(numeroRepeticiones);
 
// ******** Programamos el Job con el trigger dentro del planificador
 nuestroScheduler.scheduleJob(trigger);
 
 } catch (SchedulerException e) {
 e.printStackTrace();;
 } 
 }
 
 // Getter & Setter
 public StdScheduler getNuestroScheduler() {
 return nuestroScheduler;
 }
 
 public void setNuestroScheduler(StdScheduler nuestroScheduler) {
 this.nuestroScheduler = nuestroScheduler;
 }
 
}

Aclaraciones:

  • La dependencia al Scheduler se inyecta automáticamente mediante la anotación @Autowired.
  • Mediante setJobName se asocia el trigger al Job que habíamos definido anteriormente en el fichero de configuración de Quatz.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *