Tengo una aplicación que necesita realizar algunas acciones cada cambio de fecha, por ejemplo, a la medianoche. Cada vez que la fecha cambie la aplicación debe decirse lo mismo. Cualquier ayuda con respecto a cómo implementar la funcionalidad sería apreciada.Cómo realizar un seguimiento del cambio de fecha en Java
Respuesta
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.
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.
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.
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
Hmm, llamando cuarzo de peso pesado en comparación con la primavera ... – laura
@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. –
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
}
}
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.
- 1. Cómo realizar un seguimiento de las variables del contador en ruby, block, for, each, do
- 2. ¿Cómo realizar un seguimiento del tráfico de red en 3G/wifi en un dispositivo con iOS?
- 3. Cómo realizar la rotación del cambio en C
- 4. ¿Cómo realizar un seguimiento del estado de OpenGL en todas las llamadas a funciones?
- 5. ¿Cómo realizar un seguimiento de las instancias de clase?
- 6. Cómo realizar un seguimiento de las visitas a la página
- 7. ¿Cómo hacen esos juegos de arena de Java para realizar un seguimiento de tantas partículas?
- 8. Cómo realizar operaciones de fecha en hibernación
- 9. Realizar un seguimiento de los usuarios que han iniciado sesión
- 10. ¿Cómo realizar un seguimiento de los cambios en los objetos comerciales?
- 11. Python: herramienta para realizar un seguimiento de las implementaciones
- 12. Realizar un seguimiento de eventos con depurador JavaScript de Chrome
- 13. Realizar un seguimiento de la duración de una llamada telefónica
- 14. Python Genérico MetaClass para realizar un seguimiento de las subclases
- 15. PHP: cURL y realizar un seguimiento de todas las redirecciones
- 16. Realizar un seguimiento de los elementos eliminados usando std :: remove_if
- 17. Cómo realizar el cambio de Subversion en PHPStorm
- 18. de anulación del operador + para realizar fecha + hora = fecha y hora en Python
- 19. ¿Cómo realizar Diffs de cadena en Java?
- 20. Seguimiento de llamadas en java
- 21. de Java en tiempo real marco de seguimiento del servicio
- 22. Cómo obtener subcolecciones de la colección Java (colecciones, matrices, listas) y realizar un seguimiento de la última devuelta
- 23. ¿Existe una opción/función de MySQL para realizar un seguimiento del historial de cambios en los registros?
- 24. Cambio de Fecha de Java se retrasa una hora
- 25. En Scala, ¿cómo puedo realizar un seguimiento de los totales sin usar var?
- 26. Cómo cambiar el nombre de un directorio en Mercurial y seguir para realizar un seguimiento de todos los archivos cambia
- 27. ¿Cómo se usa ManagementEventWatcher para realizar un seguimiento de suspender/reanudar?
- 28. Variable de seguimiento o cambio de memoria en Xcode?
- 29. ¿Una buena manera de realizar un seguimiento de varias referencias entre funciones en ST monad?
- 30. forja de un seguimiento de la pila en Java
Eso no va a funcionar, desde la medianoche no se reoccuring a una tasa fija. – jarnbjo
Claro, pero en la mayoría de los casos esto no es crítico en absoluto. – Hardcoded
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