2010-03-29 20 views

Respuesta

7

Lo que estás buscando es un programador. Quartz es probablemente el programador más comúnmente utilizado en el mundo de Java, aunque Spring tiene algunas características de programación interesantes si ya está utilizando ese marco.

Cualquiera que sea el planificador que elija, generalmente especifica que se produzca una acción (a veces denominado "trabajo") y un momento para que suceda (un "activador" en la terminología de Quartz). En su caso, configuraría el activador para que se ejecutara todos los días a la medianoche y, cuando disparara, haría lo que fuera necesario, según lo especificara su trabajo.

1

Como biblioteca, puede usar Quartz y configurar desencadenantes para que se ejecuten a medianoche todas las noches. Creo que los desencadenantes simples deberían hacer el trabajo.

Como alternativa, puede implementar lo que Quartz hace usted mismo, usando un hilo separado y durmiendo hasta la próxima medianoche.

-1

Si no desea Quartz o cualquier otro framework como ese, simplemente puede usar el método scheduleAtFixedRate de ScheduledExecutorService (hay un ejemplo de cómo crear una instancia en JavaDoc).

Lo único que debe tener en cuenta es cómo calcular el comienzo del primer día.

Editar

Como se mencionó Jarnbjo: Esto no va a sobrevivir interruptores de horario de verano y el salto segundos. Así que ten en cuenta esto cuando uses el Ejecutor.

+0

Eso no va a funcionar, desde la medianoche no se reoccuring a una tasa fija. – jarnbjo

+0

Claro, pero en la mayoría de los casos esto no es crítico en absoluto. – Hardcoded

+0

Si desea que se ejecute algo a medianoche, probablemente no esté bien si el trabajo se ejecuta a las 11PM o 1AM. ¿En qué "mayoría de los casos" es este comportamiento aceptable? – jarnbjo

0

La respuesta a esta pregunta solía ser Quartz. Es el estándar de facto para programar en Java. Es bastante fácil de usar, pero es un poco pesado. Si no le importa la programación en clúster o el almacenamiento JDBC de los trabajos, el cuarzo puede ser excesivo.

Afortunadamente Spring 3.0 viene con nuevas funciones de programación. Estos permiten el tipo simple de "hacer esto cada 30 segundos" o "hacer esto todos los días a medianoche" sin utilizar cuarzo. Si ya está usando la primavera, es bastante fácil de configurar.

Ejemplo:

<task:scheduler id="scheduler" pool-size="10"/> 

<task:scheduled-tasks scheduler="scheduler"> 
    <task:scheduled ref="anotherObject" method="anotherMethod" cron="* * 00 * * *"/> 
</task:scheduled-tasks> 

Esto hará que el método 'anotherMethod' para ser llamado en usted bean llamado 'otroObjeto' a la medianoche todos los días. Se puede encontrar más información en el sitio de la primavera: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

+1

Hmm, llamando cuarzo de peso pesado en comparación con la primavera ... – laura

+0

@laura Muchas personas ya tienen la primavera como una dependencia de la COI. No recomendaría incluir Spring solo para esta característica, pero si está utilizando la primavera, es más liviano que tirar todo el cuarzo. –

0

No necesita un marco grande y abarrotado. Algo como esto debería funcionar.

import java.util.*; 
public class Midnight { 
    public static void main(String args[]) { 
     MidnightCowboy mc = new MidnightCowboy(); 
     mc.start(); 
     // on with you normal program flow (if any) here 
    } 
} 

class MidnightCowboy extends Thread { 
    static final boolean COWS_COME_HOME = false; 
    // Whatever data you need should go here 

    public void run() { 
     while (! COWS_COME_HOME) { 
      GregorianCalendar now = new GregorianCalendar(); 
      long nowMilli = now.getTimeInMillis(); 
      now.add(Calendar.DAY_OF_MONTH, 1);  // probably an easier way to set the time to the next midnight 
      now.set(Calendar.HOUR_OF_DAY, 0); 
      now.set(Calendar.MINUTE, 0); 
      now.set(Calendar.SECOND, 0); 
      now.set(Calendar.MILLISECOND, 0); 
      long midnightMilli = now.getTimeInMillis(); 
      long delta = midnightMilli - nowMilli; 
      System.out.println("Waiting " + delta + " milliseconds until midnight."); 
      // How many milliseconds until the next midnight? 
      try { 
       sleep(delta); 
       doSomething(); 
      } catch (InterruptedException e) { 
       System.err.println("I was rudely interrupted!"); 
      } 
     } 
    } 

    void doSomething() { 
     // whatever 
    } 
} 
0

Si desea una solución más ligero que una biblioteca entera, he encontrado una aplicación bastante simple here. Básicamente es una clase Timer.

Cuando la clase se ejecuta primero a través del método Start(), el código obtiene una fecha y hora de la hora actual, entonces coge un objeto de fecha y hora de la medianoche y resta el 2 veces con el fin de dar un tiempo hasta que es medianoche.

Con este tiempo, se ajusta el intervalo del temporizador e inicia el temporizador. Ahora cuando se alcanza el intervalo y el temporizador dispara su evento, reinicio el temporizador usando el mismo proceso. Esto hará que el intervalo para 24. Cuando este temporizador caduque, luego se restablece y se repite indefinidamente.

Cuestiones relacionadas