Programar tareas en Java
En muchas aplicaciones Java, es muy frecuente que tengamos la necesidad de ejecutar tareas periódicamente, muchas pueden ser las razones que nos lleven a ello, llamar periódicamente a un script que actualice una BBDD, comprobar periódicamente ciertos datos de la BBDD y dependiendo de sus valores mostrar una alarma al usuario…
Si nos encontramos ante la necesidad de hacer un desarrollo de este tipo, tenemos múltiples opciones para afrontarlo, la solución ‘casera’ es que la propia API de Java nos proporciona utilidades para hacerlo, la otra solución es, como siempre, recurrir a librerías externas al API de Java, en este artículo vamos a utilizar la librería QUARTZ.
Veamos que nos ofrece la API de Java.
La API de Java nos ofrece las clases:
– java.util.Timer
– java.util.TimerTask
Clase Timer
La clase Timer nos permite ejecutar las tareas de una forma programada, cada Timer en realidad es un Thread de Java que ejecuta todas los TimerTask que tenga asignados secuencialmente.
Sus métodos más importantes son:
Cancel( ): Termina el Timer descartando todas las tareas planificadas.
Schedule( ): Planifica la tarea a ejecutar (Consultar API para ver todas las opciones posibles).
Clase TimerTask
La clase TimerTask representa la tarea que se debe ejecutar periódicamente.
Para utilizarla tenemos que construir una clase que extienda de la clase TimerTask y sobreescribir el método run(), dentro de este método irá le código que queremos que se ejecute cuando se lance la tarea.
Sus métodos más importantes son:
Run( ) : Este método es el que se sobreescribe para que la tarea ejecute nuestro código.
Cancel( ): Desplanifica esta tarea (no se vuelve a ejecutar) pero no para el Timer que la ejecuta.
Codigo Ejemplo | Programar tareas en Java
public class Planificador {
Timer timer;
int counter1 = 0;
int counter2 = 0;
Date fecha;
boolean finTarea = false;
public Planificador ( ) {
//se crea un planificador que planificara 2 tareas
timer = new Timer ( ) ;
//la Tarea1 se ejecuta pasado 1 segundo y luego periódicamente cada segundo
timer.schedule ( new Tarea1 ( ) , 1000, 1000) ;
//la Tarea2 se ejecuta pasado 5 segundos y luego periodicamente cada segundo
timer.schedule ( new Tarea2 ( ) , 5000, 1000) ;
}
//Tarea1: Muestra el valor de un contador y lo incrementa
//cuando el contador llega a 10 se desplanifica la tarea
class Tarea1 extends TimerTask {
public void run ( ) {
System.out.println ( “Ejecucion nº “+ counter1+” de la Tarea1″) ;
if (counter1 < 5){
System.out.println ( “ El contador tiene valor: “+ counter1) ;
counter1++;
}
else{
//Si la otra tarea ya ha acabado mata al planificador
if (finTarea)
{
System.out.println ( “ ***Fin Planificador***”) ;
timer.cancel();
}
//Si la otra tarea todavia no ha acabado solo se desplanifica, el
//planificador sigue funcionando
else
{
System.out.println ( “ ***Fin Tarea1***”) ;
this.cancel ( ) ;
System.out.println ( “Tarea1 desplanificada.” ) ;
finTarea = true;
}
}
}
}
//Tarea2: Muestra la fecha actual
//cuando el contador llega a 10 se desplanifica la tarea
class Tarea2 extends TimerTask {
public void run ( ) {
System.out.println ( “Ejecucion nº “+ counter2+” de la Tarea2″) ;
fecha = new Date();
if (counter2 < 5){
System.out.println ( “ Fecha: “+ fecha) ;
counter2++;
}
else{
//Si la otra tarea ya ha acabado mata al planificador
if (finTarea)
{
System.out.println ( “ ***Fin Planificador***”) ;
timer.cancel();
}
//Si la otra tarea todavia no ha acabado solo se desplanifica, el
//planificador sigue funcionando
else
{
System.out.println ( “ ***Fin Tarea2***”) ;
this.cancel ( ) ;
System.out.println ( “Tarea2 desplanificada.” ) ;
finTarea = true;
}
}
}
}
public static void main ( String args [ ] ) {
System.out.println ( “Iniciamos el Planificador” ) ;
new Planificador ( ) ;
}
}