2017-04-21 3 views
1

Je veux démarrer ScheduledExecutorService exactement 12 heures par jour, le calendrier doit commencer aujourd'hui à 22/02/2017 00:00:00 (heure UTC), Quelqu'un peut-il me dire si mon code est correct ou pas?ScheduledExecutorService exécuter tous les soirs à 12 heures heure UTC

DateTime today = new DateTime().withTimeAtStartOfDay(); 
     DateTime startOfTommorrow = today.plusDays(1).withTimeAtStartOfDay(); 

     Long midnight = startOfTommorrow.getMillis(); 
     long midnights = (midnight/1000)/60; 
     final DateFormat nextDateTymFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

     System.out.println("***********************************"); 
     System.out.println("Schedule Updater "+nextDateTymFormat.format(new Date())); 
     System.out.println("today "+today); 
     System.out.println("startOfTommorrow "+startOfTommorrow); 
     System.out.println("midnight Long "+midnight); 
     System.out.println("***********************************"); 
     vitalScheduleThread.scheduleAtFixedRate(new Runnable() { 

      @Override 
      public void run() { 

       System.out.println("Hello vitalSchService !!"+nextDateTymFormat.format(new Date())); 

       Thread.currentThread().setName("vitalSchService"); 

       //sendMail(); 
       vitalSchedule.process(springContext); 
      } 
     }, midnight , 86400000 , TimeUnit.MILLISECONDS 

);

Répondre

1

Vous supposez que le fuseau horaire actuel de la JVM correspond à l'UTC que vous souhaitez, car vous omettez la zone en tant qu'argument lors de l'appel des méthodes date-heure. Pas nécessairement vrai. Tout code d'un thread de n'importe quelle application de cette JVM peut changer la valeur par défaut à tout moment pendant l'exécution. Au lieu de cela, spécifiez toujours la zone souhaitée/attendue.

Vous semblez utiliser la librairie Joda-Time. Ce projet est maintenant en mode maintenance, l'équipe conseillant la migration vers les classes java.time.

OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC); 
LocalDate today = now.toLocalDate(); 
LocalDate tomorrow = today.plusDays(1); 
OffsetDateTime tomorrowStart = OffsetDateTime.of(tomorrow , LocalTime.MIN , ZoneOffset.UTC); 
Duration d = Duration.between(now , tomorrowStart); 
long millisUntilTomorrowStart = d.toMillis(); 

Au lieu d'un nombre mystérieux littéral, comme 86400000, utilisez un appel autodocumenté.

TimeUnit.DAYS.toMillis(1) 

Ainsi, votre planificateur ressemblerait à ceci:

….scheduleAtFixedRate(
    new Runnable() { … } , 
    millisUntilTomorrowStart , 
    TimeUnit.DAYS.toMillis(1) , 
    TimeUnit.MILLISECONDS 
) 

pour incrémenter dans les jours entiers, vous ne devez pas utiliser une telle granularité fine en millisecondes. Les exécuteurs ne fonctionnent pas avec un timing parfait pour diverses raisons. Donc, j'aurais probablement calculé en quelques minutes. Mais pas important.

Très important: Vous devez joindre le code de votre méthode de Runnable run dans un piège pour toute exception. Si une exception de n'importe quel type devait atteindre l'exécuteur, l'exécuteur s'arrête silencieusement. Pas de planification supplémentaire des tâches et aucun avertissement. Rechercher Stack Overflow pour plus d'informations, y compris une réponse par moi.

Vous n'expliquez pas quel est l'objet sur lequel vous appelez scheduleAtFixedRate. Donc, c'est une partie importante du code que nous ne pouvons pas aider jusqu'à ce que vous postez plus d'informations. Je suis inquiet que vous l'ayez nommé "Thread". Cet objet doit être une implémentation de ScheduledExecutorService, pas un thread. Conseil: Évitez de faire fonctionner les choses à minuit exactement. Beaucoup de choses ont tendance à se produire sur les ordinateurs à minuit. Par exemple, des ajustements de seconde intercalaire, de nombreux utilitaires de nettoyage Unix et des activités de routine telles que des sauvegardes programmées par des administrateurs naïfs. Attendre quelque chose comme cinq ou quinze minutes peut éviter les tracas et les problèmes mystérieux.

+0

Salut, Oui mon temps de serveur sera toujours UTC, je vais vérifier avec vos changements plus tard, Mais s'il vous plaît vérifier mon code et laissez-moi savoir si mon code est correct ou non selon mon exigence mentionné dans le quesion – kavie

+0

pour vous avertir que vous ne devez pas * supposer que votre fuseau horaire actuel par défaut sera toujours UTC. C'est un fait hors de votre contrôle en tant que programmeur. Il n'y a pas besoin de s'appuyer sur la zone par défaut actuelle, alors pourquoi le risquer? Il suffit de passer 'ZoneOffset.UTC' comme indiqué dans mon code et vous avez un problème de moins à s'inquiéter. Vous avez dit que l'exigence est de courir à minuit UTC, et ne pas spécifier le fuseau horaire est le plus grand risque que je vois pour que cela se passe mal. –

+0

Ok Laissez-moi vérifier – kavie