Servicios en Java

Hola a todos:

Estoy desarrollando una aplicacion de recuperación de información que necesita actualizar cada cierto tiempo los documentos de entrenamiento. Tengo una aplicación que se encarga de descargar los documentos. Lo que necesito es :

¿Cómo hacer que esta aplicación se ejecute automáticamente cada cierto tiempo?

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ale_imp

Quizas te pueda Servir Quartz

Bueno la verdad yo solo e utilizado Quartz con Java-Email enviando correos a un cierto tiempo. Te dejo esta liga quizas te pueda servir.
http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=quartz.

Imagen de jali

Timer / TimerTask

Hay algunas alternativas... como dice ale_imp Quartz, otra es usando un cron en tu servidor(unix, info aqui ), un schedule task en windows... o si lo que quieres es escribir un poco de codigo, pues el siguiente ejemplo espero que te sirva.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javamexico;

import java.util.Timer;
import java.util.TimerTask;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Date;

/**
 *
 * @author Jali
 */

public class Cron extends TimerTask {
    private static  final long PERIODO = 1000 * 60;
    private static final int DIA = 0;
    private static final int HORA = 0;
    private static final int MINUTOS = 22;

    private static Date getLanzamiento() {
        Calendar lanzamiento = new GregorianCalendar();
        lanzamiento.add(Calendar.DATE, DIA);
        Calendar fecha = new GregorianCalendar(
                lanzamiento.get(Calendar.YEAR),
                lanzamiento.get(Calendar.MONTH),
                lanzamiento.get(Calendar.DATE),
                HORA,
                MINUTOS);
        return fecha.getTime();
    }

    /**
     * @param args the command line arguments
     */

    public static void main(String[] args) {
        // TODO code application logic here
        Cron cron = new Cron();
        Timer timer = new Timer();
        timer.schedule(cron, getLanzamiento(), PERIODO); // cada minuto se manda a llamar la tarea <strong> cron </strong>
    }

    @Override
    public void run() {
        System.out.println("taran! se envia algo por aqui");
    }
}

Es un ejemplo muy simple, pero efectivo para realizar estas tareas. :)

Saludos
Alejandro

Imagen de ezamudio

ScheduledExecutorService

A partir de Java 5 se recomienda usar ScheduledExecutorService en vez de Timer. En vez de TimerTask, toma como parámetro un Runnable.

Runnable cron; //inicializa esto
ScheduledExecutorService timer = Executors.newSingleThreadScheduledExecutor();
timer.scheduleAtFixedRate(cron, 1, 5, TimeUnit.MINUTES); //dentro de un minuto corre cron y luego cada 5 minutos

Y quién lanza a Quartz en primer lugar?

Siempre he tenido una duda, quién ejecuta a Quartz en primer lugar?

Debe de estar corriendo siempre en alguna aplicación ( por ejemplo un application server ) y si este application server esta abajo pues ya valió?

O tiene hooks al sistema operativo para que se levante solo?

Nunca he usado Quartz, siempre con un cron en unix la libraba y desde entonces me quedo esa duda.

Imagen de ezamudio

cron > quartz

Quartz a fin de cuentas son clases de Java que están corriendo en una JVM, así que esa JVM tiene que estar corriendo todo el tiempo para que las tareas programadas en Quartz se ejecuten. Igual que un Timer o un ScheduledExecutorService.

Para correr un programita en Java que hace una tarea específica, cada X tiempo, puedes programarla en el crontab y ya (excepto en Winblows). Si tienes un contenedor JEE puedes poner ahí a correr varias tareas con Quartz. Lo chido de Quartz es que para programar una tarea le puedes pasar una cadena tipo crontab, por ejemplo para correr algo los sábados en la madrugada "0 5 * * 6" o para correr algo cada 15 minutos de las 9 AM a las 5PM de lunes a viernes "0/15 9-17 * * 1-5"

Ah vaya.

Entonces es como un Timer supervitaminado tipo Timer = lagartija, Quartz = hulk? jejej

Imagen de ezamudio

Jerarquía

Más o menos: Timer < ScheduledExecutorService < Quartz

Quartz es un Timer con esteroides... el iPad de los timers... Timer on crack... etc. etc. Pero los otros dos sirven bastante bien para correr cualquier Runnable periódicamente de manera simple (aunque ya no se recomienda usar Timer, es medio obsoleto ya, sobretodo habiendo ScheduledExecutorServices que pueden tener un thread pool)

Imagen de jali

ScheduledExecutorService vs Timer

Creo que tocas un punto muuuy importante, que con ScheduledExecutorService puedes tener un thread pool y con Timer no, ahi esta la principal ventaja y diferencia.
Entonces... Quartz quedaria como la mejor opcion para este caso no? bueno... yo lo haria con un crontab ejejejeje.
Ipad de los timers jajajaja

Seeeehhh... yo también lo

Seeeehhh... yo también lo haría con el crontab que sería más bien como el walkman de los timers, no no , esperen, sería más bien como la grabadora de pilas de casette de los timer, de esas que llevaban al hombre para el break dance en los 80's, jejeje