Saltar al contenido
Codifíca.me | Desarrollo web | Programación

Ejecutar tareas programadas en Java.

25 agosto, 2010

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 ( ) ;

}

}