2017-10-20 30 views
1

J'ai une application Spring Boot avec divers planificateurs qui utilisent l'annotation @Scheduled. Certains des programmes sont configurés en utilisant fixedRate, d'autres utilisent cron. Les horaires fixedRate fonctionnent bien, mais j'ai remarqué qu'au cours du dernier mois, l'heure réelle à laquelle le cron planifie le feu varie de 1 à 2 heures par jour.Printemps Cron programmé des tâches tirées au mauvais moment

dire un emploi avec une configuration cron de

@Scheduled(cron = "0 0 2 * * *") 

se déclenche à 3h00 au lieu de 2h00. Cela n'arrive pas tous les jours non plus. Il fonctionnera en même temps pendant quelques jours d'affilée, puis il se passe quelque chose et il s'éteint une heure de plus chaque fois qu'il est exécuté jusqu'à ce que je redémarre l'application.

L'heure du système sur le serveur est exacte, je suis à court d'idées ici. Est-ce que quelqu'un a déjà rencontré ça?

EDIT 1

J'ai mis dans une exploitation forestière afin de déterminer si les travaux ont été mal tir au même intervalle, et les résultats semblent aléatoires. Voici les début/fin des temps pour le travail cron mentionné ci-dessus sur trois jours:

Format: Calendar.getInstance().getTime() (System.currentTimeMillis()) 

Start: Sat Oct 21 03:14:15 CDT 2017 (1508573655778) 
End: Sat Oct 21 03:22:24 CDT 2017 (1508574144708) 

Start: Sun Oct 22 02:26:58 CDT 2017 (1508657218774) 
End: Sun Oct 22 02:35:12 CDT 2017 (1508657712492) 

Start: Mon Oct 23 02:00:03 CDT 2017 (1508742003072) 
End: Mon Oct 23 02:08:11 CDT 2017 (1508742491493) 

Répondre

0

Enfin compris. Je n'avais pas d'installation ThreadPoolTaskScheduler, donc je n'avais pas assez de pool de threads pour exécuter tous mes jobs planifiés.

@Configuration 
public class TaskSchedulerConfig { 

    @Bean 
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() { 
     ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); 
     threadPoolTaskScheduler.setPoolSize(30); 
     return threadPoolTaskScheduler; 
    } 

} 
2

Est-il tiré exactement 1 heure de repos à chaque fois, ou est-il variable que vous avez mentionné? Comment mesurez-vous l'heure à laquelle il se déclenche - en utilisant la journalisation? Et combien de temps dure la méthode que vous annotez? Enregistrez un message au début et à la fin de la méthode et comparez ces horodatages. Vous pouvez essayer d'utiliser

private static final String CRON_SCHEDULE = "0 0 2 * * ?"; 
private static final String USER_TIMEZONE = "America/New_York"; 
// ... 
@Scheduled(cron = CRON_SCHEDULE, zone = USER_TIMEZONE) 
/* your method here */ 

pour voir si les résultats sont différents lorsque vous spécifiez le fuseau horaire.

+0

Hey Blake. J'ai ajouté un enregistrement vendredi dernier et je l'ai laissé passer la fin de semaine pour obtenir des résultats. J'ai posté ces résultats dans ma question originale. –

+0

Oui, il semble que les heures de début ne tirent pas sur un calendrier si c'est ce qu'ils sont censés faire. Quelles autres annotations avez-vous? est la méthode programmée dans un composant de ressort, un contrôleur ou une classe de service? – Blake

+1

Enfin compris. Je n'avais pas d'installation ThreadPoolTaskScheduler, donc il n'y avait pas assez de taille de pool pour supporter tous mes jobs planifiés. L'un tirait, les autres étaient soit bloqués, soit mis sur une sorte de file d'attente interne, mais quand ils finissaient par tirer, l'horloge cron est décalée de quelque temps qu'ils aient été mis en file d'attente/bloqués. –