:::: MENU ::::

Quartz con Cron

Introducción

Quartz Scheduler es una herramienta para la planificación de trabajos escrita en Java. Nos permite ejecutar tareas en cualquier momento y con cualquier frecuencia.

Instalación

Una forma muy sencilla de instalar Quartz Scheduler en nuestro proyecto es mediante Maven.

Creamos un proyecto Java de tipo Maven y añadimos la dependencia de Quartz. También será necesario escoger una librería con una implementación de logger. Para este caso usaré LogBack.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.luisgomezcaballero</groupId>
	<artifactId>quartz-mysql-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Quartz Demo</name>
	<dependencies>
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.3.1</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.2.3</version>
		</dependency>
	</dependencies>
</project>

Necesitamos, primeramente, crear un componente que extienda de Job, donde programaremos la tarea que necesitamos que se ejecute.

TheJob.java

package com.luisgomezcaballero.quartzcrondemo;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TheJob implements Job {
	
	public void execute(JobExecutionContext context) throws JobExecutionException {
		System.out.println("Hello world.");
	}
	
}

Y ahora, en una clase Main, después de usar este componente Job, crearemos un disparador (un Trigger). La parte más importante es la expresión Cron que se usa para definir la frecuencia de ejecución del Job. En nuestro caso es “0/5”, que significa “cada cinco segundos”. Y después de haber instanciado el Job y el Trigger, podemos hacer uso del componente planificador (Scheduler) para que los relacione.

Main.java

package com.luisgomezcaballero.quartzcrondemo;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class Main {

	public static void main(String[] args) {
		try {
			JobDetail myJob = JobBuilder.newJob(TheJob.class).withIdentity("myjob", "mygroup").build();
			Trigger myTrigger = TriggerBuilder.newTrigger().withIdentity("mytrigger", "mygroup").startNow()
					.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build();
			Scheduler myScheduler = new StdSchedulerFactory().getScheduler();
			myScheduler.start();
			myScheduler.scheduleJob(myJob, myTrigger);
		} catch (SchedulerException e) {
			e.printStackTrace();
		}
	}
	
}

Resultado

Clic derecho sobre el componente Main.java, y Run As/Java Application. Veremos como cada cinco segundo se muestra el mensaje por la consola.

Resultado en consola

19:11:07.597 [main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
19:11:07.602 [main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
19:11:07.613 [main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
19:11:07.614 [main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.1 created.
19:11:07.614 [main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
19:11:07.615 [main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.1) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

19:11:07.615 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
19:11:07.615 [main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.1
19:11:07.615 [main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
19:11:07.615 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 0 triggers
19:11:07.619 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
19:11:10.010 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'mygroup.myjob', class=com.luisgomezcaballero.quartzcrondemo.TheJob
19:11:10.027 [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job mygroup.myjob
Hello world.
19:11:10.027 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers
19:11:15.003 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.PropertySettingJobFactory - Producing instance of Job 'mygroup.myjob', class=com.luisgomezcaballero.quartzcrondemo.TheJob
19:11:15.004 [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.core.JobRunShell - Calling execute on job mygroup.myjob
Hello world.
19:11:15.005 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread - batch acquisition of 1 triggers

Repositorio

El código de este proyecto está disponible en el repositorio https://github.com/luisgomezcaballero/quartz-cron-demo.


So, what do you think ?