0

J'ai créé un module d'écoute Web qui contient un ScheduledExecutorService pour exécuter un travail à une date et une heure spécifiques, puis à intervalles réguliers. Ce planificateur vérifie une date et une heure spécifiques pour effectuer le travail. Le planificateur fonctionne avec l'heure UTC. Le problème est que quand je l'exécute sur mon localhost cela fonctionne parfaitement mais quand je le mets sur le serveur distant (server et mon localhost ne sont pas dans le même TimeZone) il ne fonctionne pas correctement (ils produisent une valeur différente de System. currentTimeMillis(). Avec l'aide d'un enregistreur que j'ai vérifié la valeur de System.currentTimeMillis() à la fois sur localhost et le serveur et ils sont différents.Comment obtenir la même valeur pour l'heure actuelle en millisecondes sur localhost et server?

Voici mon planificateur.

private static ScheduledExecutorService execService = Executors.newScheduledThreadPool(1, namedThreadFactory); 
final Calendar date = new GregorianCalendar(); 
date.setTimeZone(TimeZone.getTimeZone("UTC")); 
    execService.scheduleAtFixedRate(new Runnable() { 
       @Override 
     public void run() { 

        logger.info("Scheduler ran"); 

        try { 


         if (date.get(Calendar.DAY_OF_MONTH) == 1) { 
          if (!(System.currentTimeMillis() - getStartTime().getTime() > 300000)) { 
           logger.info("Doing the job"); 
           myJob(); 
          } 
          else{ 
           logger.info("Too late after scheduled time"); 
          } 
         } else { 

          logger.info("Current Day of Month: " + date.get(Calendar.DAY_OF_MONTH) + ". Job will be done on 1st Day of the month"); 
         } 
        } catch (Exception ex) { 

         logger.info(ex); 
        } 

       } 

      }, getInitialDelay(), (2*60000), TimeUnit.MILLISECONDS); 

     } 

     private static long getOffsetTime() { 
      Calendar dateForOffset = new GregorianCalendar(); 
      dateForOffset.setTimeZone(TimeZone.getTimeZone("UTC")); 
      int days = dateForOffset.getActualMaximum(Calendar.DAY_OF_MONTH); 

      switch (days) { 
       case 31: 
        offsetTimeInMilli = PERIOD; 
        break; 
       case 29: 
        offsetTimeInMilli = (-1) * PERIOD; 
        break; 
       case 28: 
        offsetTimeInMilli = (-2) * PERIOD; 
        break; 
       default: 
        break; 
      } 
      return offsetTimeInMilli; 
     } 

     private static long getInitialDelay() { 
      long currentTime = System.currentTimeMillis(); 
      logger.info("Current Time " + currentTime); 
      logger.info("Set Time to do the job -->" + getStartTime().getTime() + " Milliseconds"); 
      initialDelay = getStartTime().getTime() - currentTime; 
      logger.info("Initial Delay Found : " + initialDelay + " Milliseconds"); 
      return initialDelay; 

     } 

     private static Date getStartTime() { 
      Calendar d10am = Calendar.getInstance(); 
      d10am.setTimeZone(TimeZone.getTimeZone("UTC")); 
      //logger.info("Day of Month ----- >" + d10am.get(Calendar.DAY_OF_MONTH)); 
      //d10am.set(Calendar.DAY_OF_MONTH, 1); 
      d10am.set(Calendar.HOUR_OF_DAY, 5); 
      d10am.set(Calendar.MINUTE, 55); 
      d10am.set(Calendar.SECOND, 0); 
      d10am.set(Calendar.MILLISECOND, 0); 
      d10am.get(Calendar.DAY_OF_MONTH); 
      //logger.info("Day of Month ----- >" + Calendar.DAY_OF_MONTH); 

      return d10am.getTime(); 
     } 
+1

mais qu'est-ce que cela signifie: *** il ne fonctionne pas correctement ***, comment pouvons-nous vous aider avec une description aussi large de l'erreur? –

+0

J'ai modifié la question. Le principal problème est que le planificateur donne une valeur différente de System.currentTimeMillis() qui provoque des résultats inattendus. – user2531123

+0

System.currentTimeMillis() renvoie l'heure de l'ordinateur sur lequel la machine virtuelle Java est exécutée. Pourquoi voulez-vous les mêmes valeurs dans les deux serveurs. Quel est votre problème réel. – Avinash

Répondre

3

L'un ou les deux doivent être wron g. La valeur System.currentTimeMillis() est indépendante des fuseaux horaires. Vraiment, la bonne façon de synchroniser les temps sur ces serveurs est que chaque serveur se synchronise avec un serveur de temps utilisant NTP (Network Time Protocol).

Il s'agit plus d'un problème d'administration système que d'un problème de programmation Java.

+0

Merci, c'était vraiment un problème d'administration système. Tout ce que j'avais à faire était d'installer ntp sur mon système et de synchroniser avec un serveur de temps en utilisant "ntpdate time.apple.com". – user2531123