2010-03-29 39 views

risposta

7

Quello che stai cercando è un programmatore. Quartz è probabilmente lo scheduler più utilizzato nel mondo Java, sebbene Spring abbia alcune interessanti funzionalità di pianificazione se si sta già utilizzando tale framework.

Qualunque sia di pianificazione che si sceglie, si specifica in genere un'azione a verificarsi (a volte indicato come un "lavoro") e un tempo che accada (un "trigger" nella terminologia Quartz). Nel tuo caso, avresti impostato il trigger per l'esecuzione ogni giorno a mezzanotte e, quando è stato attivato, avrebbe fatto tutto ciò che era necessario, come specificato dal tuo lavoro.

1

come una libreria, è possibile utilizzare Quartz e impostare trigger per l'esecuzione a mezzanotte ogni notte. Penso che i semplici trigger dovrebbero fare il lavoro.

In alternativa, è possibile implementare ciò quarzo fa da soli, utilizzando un thread separato e dormire fino alla prossima mezzanotte.

-1

Se non si desidera Quartz o qualsiasi altro framework come quello, è possibile utilizzare semplicemente il metodo scheduleAtFixedRate dello ScheduledExecutorService invece (c'è un esempio di come istanziarne uno sul JavaDoc).

L'unica cosa che dovete pensare è come calcolare l'inizio del primo giorno.

Modifica

Come Jarnbjo detto: Questo non sopravviverà interruttori ora legale e saltare secondi. Quindi, tieni presente questo quando usi l'Esecutore.

+0

Che non funziona, poiché la mezzanotte non si ripresenta a una velocità fissa. – jarnbjo

+0

Certo, ma nella maggior parte dei casi questo non è affatto critico. – Hardcoded

+0

Se vuoi che qualcosa venga eseguito a mezzanotte, probabilmente è _non_ ok se il lavoro è eseguito alle 23:00 o alle 1:00. In quale "maggior parte dei casi" è questo comportamento accettabile? – jarnbjo

0

La risposta a questa domanda usato per essere Quartz. È lo standard de facto per la programmazione in Java. È abbastanza facile da usare, ma è un po 'pesante. Se non ti interessa la pianificazione in cluster o l'archiviazione JDBC dei lavori, il quarzo potrebbe essere eccessivo.

Per fortuna Spring 3.0 è dotato di nuove funzionalità di pianificazione. Questi consentono il semplice tipo "fai questo evey 30 secondi" o "fai questo tutti i giorni a mezzanotte" senza usare il quarzo. Se stai già usando la primavera è abbastanza facile da configurare.

Esempio:

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

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

Questo farà sì che il metodo 'anotherMethod' di essere chiamato su di voi fagiolo di nome 'anotherObject' a mezzanotte tutti i giorni. Maggiori informazioni possono essere trovate sul sito di primavera: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/scheduling.html

+1

Hmm, chiamata Quartz Heavyweight in confronto a Spring ... – laura

+0

@laura Molte persone hanno già Spring come dipendenza per IoC. Non suggerirei di includere Spring solo per questa funzione, ma se si utilizza la molla, questo è più leggero del peso di tutto il quarzo. –

0

Non hai bisogno di un grande quadro di bloaty. Qualcosa del genere dovrebbe funzionare.

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

Se si desidera una soluzione più leggera di un'intera biblioteca, ho trovato una bella semplice implementazione here. È fondamentalmente una classe Timer.

Quando la classe viene dapprima eseguita tramite il metodo Start(), il codice ottiene un datetime dell'ora corrente, poi ottiene un oggetto datetime di mezzanotte e sottrae le 2 volte per dare un tempo fino a quando è mezzanotte.

Con questo tempo, imposta l'intervallo del timer e avvia il timer. Ora, quando viene raggiunto l'intervallo e il timer scocca il suo evento, resetto il timer usando la stessa procedura. Questo farà l'intervallo per 24. Quando questo timer scade, viene quindi resettato e ripetuto all'infinito.

Problemi correlati