quelle différence entre le taux fixe et le retard fixe dans le calendrier printemps?


J'implémente des tâches planifiées à l'aide de spring et je vois avoir 2 heures de configuration de type qui fonctionnent à nouveau à partir du dernier. Quelle différence entre 2 tapez cette configuration.

 @Scheduled(fixedDelay = 5000)
    public void doJobDelay() {
        // do anything
    }
  @Scheduled(fixedRate = 5000)
    public void doJobRate() {
        // do anything
    }
Author: Adam, 2016-08-09

5 answers

  • fixedRate: permet à Spring d'exécuter la tâche à intervalles périodiques même si le la dernière invocation peut toujours être en cours d'exécution.
  • fixedDelay: contrôle spécifiquement l'heure d'exécution suivante lorsque le dernière exécution se termine.

Dans le code:

@Scheduled(fixedDelay=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated once only the last updated finished ");
    /**
     * add your scheduled job logic here
     */
}


@Scheduled(fixedRate=5000)
public void updateEmployeeInventory(){
    System.out.println("employee inventory will be updated every 5 seconds from prior updated has stared, regardless it is finished or not");
    /**
     * add your scheduled job logic here
     */
}
 18
Author: kuhajeyan, 2018-03-19 16:05:02

FixedRate: Il est utilisé pour exécuter la méthode job toutes les n millisecondes. Il n'est pas important que le travail ait déjà terminé sa tâche précédente.

FixedDelay: Il est utilisé pour exécuter la méthode de travail séquentiellement avec le temps d'attente de n millisecondes donné entre les tâches.

Quand les utiliser "fixedRate": fixedRate est approprié s'il ne devrait pas dépasser la taille de la mémoire et du pool de threads. Si les tâches entrantes ne se terminent pas rapide, il peut se retrouver avec "Out of Memory exception"

Quand les utiliser "fixedDelay": Si chaque tâche en cours d'exécution est pertinente l'une pour l'autre et qu'elle doit attendre avant la fin de la précédente, fixedRate convient. Si l'heure de fixedDelay est définie avec soin, cela laissera également aux threads en cours d'exécution suffisamment de temps pour terminer leurs travaux avant le début de la nouvelle tâche

 7
Author: ahmetcetin, 2017-07-25 16:46:26

"fixedRate" : attend X millis depuis le début de l'exécution précédente avant de commencer l'exécution suivante. Si l'exécution en cours dépasse l'intervalle 'fixedRate', l'exécution suivante est mise en file d'attente, mais seulement la suivante. Il ne créera pas de série d'exécutions en file d'attente

private static int i = 0;

@Scheduled(initialDelay=1000, fixedRate=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

Sortie:

Commencé: 1
Fini: 1 / / après 4 secondes
Démarré: 2 / / immédiatement sans attendre 1 sec comme spécifié dans fixed rate
Fini: 2 / / après 4 secondes
et ainsi de suite

"fixedDelay" : attend X millis à partir de la fin de l'exécution précédente avant de commencer l'exécution suivante. Peu importe le temps que prend l'exécution en cours, la prochaine exécution est démarrée après l'ajout de l'intervalle 'fixedDelay' à l'heure de fin de l'exécution en cours. Il ne mettra pas en file d'attente la prochaine exécution.

private static int i = 0;

@Scheduled(initialDelay=1000, fixedDelay=1000)
public void testScheduling() throws InterruptedException {
    System.out.println("Started : "+ ++i);
    Thread.sleep(4000);
    System.out.println("Finished : "+ i);
}

Sortie:

Commencé: 1
Fini: 1 / / après 4 secondes Commencé : 2 / / attend 1 seconde comme spécifié dans fixedDelay Fini: 2 / / après 4 secondes Commencé: 3 / / après 1 seconde
et ainsi de suite

 6
Author: nikhil7610, 2018-04-12 10:08:12

Délai fixe : contrôle spécifiquement le temps d'exécution suivant lorsque la dernière exécution se termine.

Fixed Rate : permet à Spring d'exécuter la tâche à intervalles périodiques même si la dernière invocation est toujours en cours d'exécution.

 0
Author: Jinen Kothari, 2016-08-09 06:25:56

Une chose qui devrait être clarifiée est que fixedRate ne signifie pas que les exécutions commenceront avec un certain intervalle de temps.

Si une exécution coûte trop de temps (plus que le taux fixe), l'exécution suivante ne commencera QU'APRÈS la fin de la précédente, à moins que @Async et @EnableAsync ne soient fournis. Les codes sources suivants qui font partie de l'implémentation de Spring ThreadPoolTaskScheduler expliquent pourquoi:

@Override
public void run() {
    Date actualExecutionTime = new Date();
    super.run();
    Date completionTime = new Date();
    synchronized (this.triggerContextMonitor) {
        this.triggerContext.update(this.scheduledExecutionTime, actualExecutionTime, completionTime);
        if (!this.currentFuture.isCancelled()) {
            schedule();
        }
    }
}

Vous pouvez voir que seulement après la tâche précédente est terminée (super.run()), le la tâche suivante est planifiée (schedule()). Avec @Async et @EnableAsync, super.run() est une fonction asynchrone qui reviendra immédiatement, donc la tâche suivante n'a pas à attendre que la précédente se termine réellement.

 0
Author: fifman, 2018-04-04 08:37:42