Mi aplicación Java debe enviar un correo electrónico a todos los usuarios una vez al día. Me gustaría entregarlo aproximadamente a las 2 a.m. en función de la hora local de cada usuario. Entonces, un usuario en Nueva York recibiría el mensaje a las 2 AM hora de América/New_York. Un usuario de Los Ángeles recibiría el mensaje a las 2 AM América/Los_Angeles. Mi proceso de correo se ejecutará una vez cada hora del día.Realizar una acción diaria en un momento específico según la zona horaria local del usuario
Planeo usar funciones de geolocalización de HTML5 o geolocalización de direcciones IP para determinar automáticamente el huso horario de cada usuario durante el registro. Por supuesto, el usuario puede modificar la zona horaria manualmente si estos valores son incorrectos. Tengo la intención de almacenar la zona horaria seleccionada en el objeto Usuario como una cadena de identificación de zona horaria, como "América/Nueva_York". Esto persistirá en la base de datos como una cadena, pero esto podría cambiarse si es necesario.
Aspectos a considerar:
- que necesitan para tener en cuenta el horario de verano, por lo que el usuario siempre recibe el correo electrónico a las 2. Esto significa que no puedo simplemente almacenar GMT-8 o compensaciones UTC similares en el objeto de usuario. Parte del año Los Ángeles está en GMT-7, y otras partes está en GMT-8.
- Another SO question tiene respuestas que sugieren almacenar información de compensación, pero no veo cómo funcionaría ya que los tiempos en diferentes lugares pueden cambiar a lo largo del año. No voy a actualizar todas las zonas horarias de mis objetos de usuario cada vez que ocurra un evento de cambio de zona horaria en algún lugar del mundo.
- Estoy usando JodaTime en mi aplicación, por lo que puedo aprovecharlo si lo ayuda.
- Estoy usando Hibernate para consultas de bases de datos y me gustaría encontrar una solución que pueda manejarse en una consulta de hibernación, sin necesidad de procesar cientos de miles de registros de usuario en Java.
Estoy usando las funciones de cron de programación de primavera (a través de Quartz) para ejecutar un método en 2 minutos después de la hora cada hora del día. En este momento, la mayoría de mis usuarios están en América/Los_Angeles, por lo que estoy forzando manualmente que todos los correos se envíen a las 2:02 AM, hora del Pacífico. El siguiente método se ejecuta cada hora a las: 02 horas después de la hora, pero verifica manualmente la hora y solo continúa si la hora actual en Los Ángeles es en las 2:00 horas. Esto significa que los usuarios de otros lugares recibirán el correo electrónico en un horario diferente a las 2 AM.
@Scheduled(cron="0 2 * * * *")
public void sendDailyReportEmail() {
DateTime now = new DateTime(DateTimeZone.forID("America/Los_Angeles"));
if (now.getHourOfDay() != 2) {
log.info("Not 2AM pacific, so skipping email reports");
return;
}
// send email reports
}
Por lo tanto, lo que necesito es llevar a cabo una consulta de base de datos que me dará todos los usuarios que tienen una hora de la hora 2:00, en base a la zona horaria en su objeto Usuario. ¿Alguna idea sobre cómo lograr esto?