Ho un'applicazione che ha bisogno di fare alcune azioni ogni cambio di data dicono a mezzanotte. Ogni volta che la data cambia l'applicazione deve essere detta della stessa. Sarebbe gradito qualsiasi aiuto su come implementare la funzionalità.Come tenere traccia della modifica della data in Java
risposta
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.
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.
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.
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
Hmm, chiamata Quartz Heavyweight in confronto a Spring ... – laura
@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. –
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
}
}
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.
- 1. Come tenere traccia della profondità nella prima ricerca?
- 2. Come si usa ManagementEventWatcher per tenere traccia della sospensione/ripresa?
- 3. Come tenere traccia dei messaggi in Android?
- 4. Come possiamo tenere traccia della filiale della nostra copia di lavoro?
- 5. Data dell'ultima modifica della directory
- 6. Utilizzo di PerformanceCounter per tenere traccia della memoria e dell'utilizzo della CPU per processo?
- 7. Come tenere traccia della distribuzione nella webapp di Azure in NewRelic?
- 8. Come tenere traccia della posizione di un dispositivo Android in un edificio?
- 9. Traccia una durata della telefonata
- 10. Tenere traccia delle modifiche - Django
- 11. Tenere traccia delle classi di utilità
- 12. Come tenere traccia degli eventi nell'estensione?
- 13. Come tenere traccia degli utenti tra domini?
- 14. Dateformatter modifica l'anno della mia data
- 15. Tenere traccia degli utenti registrati in PHP
- 16. Analisi della data RFC 2822 in JAVA
- 17. Modifica della data Utc nella data locale utilizzando moment.js
- 18. Tenere traccia di indice in rapida enumerazione
- 19. Come convertire la data della stringa in Timestamp in java?
- 20. Come tenere traccia degli ascoltatori in Firebase su Android?
- 21. Come può un programma Java tenere traccia della dimensione massima effettiva dell'heap utilizzata durante la sua esecuzione?
- 22. Come formattare la stringa della data in java?
- 23. Componente della GUI del selettore della data per Java Swing
- 24. Analisi errata della data utilizzando SimpleDateFormat, Java
- 25. Come tenere traccia delle prestazioni del server IIS
- 26. Come tenere traccia delle applicazioni WinRT (in Win32 era semplice)?
- 27. Come tenere traccia di più eventi tattili in Libgdx?
- 28. Come tenere traccia degli eventi personalizzati in paper_trail?
- 29. Qual è il modo più semplice per tenere traccia di una modifica in una cartella in Java?
- 30. Modifica il formato della data della stringa e impostato in TextView in Android?
Che non funziona, poiché la mezzanotte non si ripresenta a una velocità fissa. – jarnbjo
Certo, ma nella maggior parte dei casi questo non è affatto critico. – Hardcoded
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