2017-10-20 4 views
1

Ich habe einen Frühling Boot-Anwendung mit verschiedenen Disponenten, die die @Scheduled Annotation verwenden. Einige der Zeitpläne werden mit fixedRate eingerichtet, andere verwenden cron. Die fixedRate-Zeitpläne laufen gut, aber mir ist aufgefallen, dass die tatsächliche Zeit, in der der Cron-Befehl ausgelöst wird, im Laufe des letzten Monats um 1-2 Stunden pro Tag variiert.Frühling Geplante Cronjobs zur falschen Zeit Brennen

das heißt einen Job mit cron-Setup von

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

wird um 3:00 Uhr Feuer statt 02.00. Es passiert auch nicht jeden Tag. Es wird für ein paar Tage hintereinander zur gleichen Zeit ausgeführt, dann passiert etwas und es wird jedes Mal um eine weitere Stunde ausgeschaltet, bis ich die Anwendung neu starte.

Die Systemzeit auf dem Server genau ist, bin ich alle hier aus Ideen. Ist das schon mal jemand begegnet?

EDIT 1

ich in einiger Protokollierung setzen, um festzustellen, ob die Aufträge im gleichen Intervall Brennen falsch waren, und die Ergebnisse scheinen zufällig. Hier sind die Start-/Endzeiten für die oben genannten Cron-Job über drei Tage:

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) 

Antwort

0

dachte es schließlich heraus. Ich hatte keine ThreadPoolTaskScheduler-Einrichtung, daher hatte ich keinen ausreichend großen Thread-Pool für die Ausführung aller geplanten Jobs.

@Configuration 
public class TaskSchedulerConfig { 

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

} 
2

Ist es Brennen genau 1 Stunde aus jeder Zeit, oder ist es variabel wie Sie erwähnt haben? Wie messen Sie die Zeit, zu der es zündet - mit Protokollierung? Und wie lange dauert die Methode, die Sie notieren? Protokollieren Sie am Anfang und Ende der Methode eine Nachricht und vergleichen Sie diese Zeitstempel. Sie könnten versuchen

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 */ 

zu verwenden, um festzustellen, ob die Ergebnisse unterschiedlich sind, wenn Sie die Zeitzone angeben.

+0

Hey Blake. Ich habe letzten Freitag ein wenig Logging hinzugefügt und es über das Wochenende laufen lassen, um einige Ergebnisse zu sammeln. Ich habe diese Ergebnisse in meiner ursprünglichen Frage veröffentlicht. –

+0

Ja, es scheint so, als würden die Startzeiten nicht nach einem Zeitplan ablaufen, wenn es das ist, was sie tun sollen. Welche anderen Anmerkungen hast du? ist die geplante Methode in einer Federkomponente, einem Controller oder einer Serviceklasse? – Blake

+1

Endlich herausgefunden. Ich hatte keine ThreadPoolTaskScheduler-Einrichtung, daher war die Poolgröße nicht groß genug, um alle geplanten Jobs zu unterstützen. Man würde schießen, würden die andere entweder blockiert werden, oder auf irgendeine Art von interner Warteschlange gestellt, aber wenn sie schließlich dann der cron Uhr abgefeuert wird ausgeglichen durch wie lange wurden sie Warteschlange/gesperrt. –

Verwandte Themen