2011-08-06 31 views
13

Soy relativamente nuevo en Java y he elegido un proyecto para trabajar. Sin embargo, me encontré con un bloque. Necesito un método para ejecutar en ciertos momentos durante el día. He hecho bastante búsqueda, pero no puedo encontrar nada que parezca que sería suficiente. Me encontré con la clase Timer, pero parece que se ejecuta en ciertos intervalos. La clase Programador parecía tener el mismo problema. También me encontré con Quartz pero creo que necesito algo más liviano y solo podía ver cómo hacer las cosas a intervalos.Ejecutar un método Java a una hora establecida todos los días

Quizás, solo porque soy nuevo, he echado de menos algunas cosas que podrían ayudarme en estas clases, pero estoy realmente atascado y podría necesitar algo de ayuda.

Si alguien pudiera dirigirme a una clase que ejecutará algo a una hora determinada del día, todos los días (puntos de bonificación por poder cancelar el evento), y mostrarme cómo usar correctamente la clase, sería increíble !

TL; DR: Necesita una clase que hace algo a una hora del día, no en un intervalo porque el programa puede reiniciarse varias veces a lo largo del día.

+2

He escrito una publicación que regraba este punto. Esto podría ayudarte: http://harryjoy.wordpress.com/2011/07/09/create-a-scheduler-task-in-java/ –

+0

@ Harry Joy que fue útil. No sabía sobre Quartz –

Respuesta

26

tratar la clase TimerTask

para obtener más información echa un vistazo a http://oreilly.com/java/archive/quartz.html

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

public class ReportGenerator extends TimerTask { 

    public void run() { 
    System.out.println("Generating report"); 
    //TODO generate report 
    } 

} 

class MainApplication { 

    public static void main(String[] args) { 
    Timer timer = new Timer(); 
    Calendar date = Calendar.getInstance(); 
    date.set(
     Calendar.DAY_OF_WEEK, 
     Calendar.SUNDAY 
    ); 
    date.set(Calendar.HOUR, 0); 
    date.set(Calendar.MINUTE, 0); 
    date.set(Calendar.SECOND, 0); 
    date.set(Calendar.MILLISECOND, 0); 
    // Schedule to run every Sunday in midnight 
    timer.schedule(
     new ReportGenerator(), 
     date.getTime(), 
     1000 * 60 * 60 * 24 * 7 
    ); 
    }//Main method ends 
}//MainApplication ends 
+3

+1: Me encanta el cuarzo, también. Pero usarlo vs. iniciar la tarea con cron hace que sea su responsabilidad que la aplicación nunca falle, se reinicie automáticamente si aún falla, etc. – Daniel

+2

¡Tenga en cuenta que esto se rompe después de un cambio en el horario de verano! El temporizador se ejecutará una hora tarde o más rápido, aquí a la 1 a.m. o a las 11 p.m. (dependiendo de si se inició en verano y la transición a la hora de invierno, o al revés). – Philipp

+0

Tenía add date.set (Calendar.AM_PM, Calendar.AM); o PM para que funcione a la hora exacta que esperaba. –

4

Recomiendo encarecidamente, si es posible, que el mejor enfoque sería invocar el script o la aplicación Java utilizando el programador del SO: por ejemplo, "cron" en * nix o "task scheduler" en Windows .

+0

Me gustaría secundar esa sugerencia. ¿Por qué reimplementar todo y preocuparse por administrar la aplicación Java? @Eegabooga ¿realmente necesitas esto en Java? Las soluciones ligeras pueden implementarse si las necesita, pero está reinventando mucho y probablemente no sea tan robusto. –

+0

Gracias a todos por sus respuestas. Sin embargo, estoy casi 100% seguro de que esto debe estar dentro de Java. No es el programa el que necesita relanzarse a una hora determinada todos los días, es una acción que hace el programa. Incluso si cron pudiera hacer esto, este programa no es para mí sino para otra persona. Lo que estoy haciendo es un complemento para un servidor de juegos y el complemento se conecta al servidor de este tipo. Si es posible, podría enviarle los archivos cron que necesitaría si cree que esto funcionaría, pero recuerde que necesito un método para ejecutar dentro del programa, no el programa en sí (perdón si la sintaxis está equivocada, aún estoy aprendiendo) –

+0

Ok, ahora veo que puedo ejecutar un cronjob a través de Java con Quartz. –

2

Una posibilidad podría ser el uso de un programador externo - en función de la precisión deseada. En UNIX use CRON, en Windows use el Programador de Windows. Eso aísla muy bien el tiempo de hacerlo.

Puede usar un temporizador y crear una clase simple que verifique el tiempo cada minuto o 5 minutos dependiendo de la granularidad deseada. Sería muy ligero.

Cuestiones relacionadas