Java Spring @Scheduled-Aufgaben werden zweimal ausgeführt

Lesezeit: 4 Minuten

Benutzer-Avatar
KS1

Ich habe hier eine einfache Testmethode, die so eingestellt ist, dass sie alle 5 Sekunden ausgeführt wird, und das tut sie auch, aber wenn Sie sich das System.out ansehen, können Sie sehen, dass es etwas Seltsames zu tun scheint.

@Scheduled(cron="*/5 * * * * ?")
public void testScheduledMethod() {
     System.out.println(new Date()+" > Running testScheduledMethod...");
}

Ausgabe:

Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:15 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:20 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:25 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...
Wed Jan 09 16:49:30 GMT 2013 > Running testScheduledMethod...

Warum läuft es ZWEIMAL? (in Erscheinung treten) jedes Mal?

  • Welche Version von Spring verwendest du? Sind Sie sicher, dass Sie den Kontext nicht zweimal laden, wodurch zwei Scheduler-Threads erstellt werden?

    – Swapnil

    9. Januar 2013 um 17:12 Uhr


  • Versuchen Sie zu protokollieren, wenn eine Instanz der Klasse erstellt wird

    – Amanuel Nega

    27. Dezember 2016 um 8:35 Uhr

Benutzer-Avatar
nikolaus.hauschild

Schaut man sich die Dokumentation an, findet sich ein Hinweis, der explizit auf dieses Phänomen hinweist.

Der Hinweis ist unter Abschnitt 25.5.1 unter diesem Linkund lautet:

Stellen Sie sicher, dass Sie zur Laufzeit nicht mehrere Instanzen derselben Annotationsklasse @Scheduled initialisieren, es sei denn, Sie möchten Rückrufe für jede dieser Instanzen planen. Stellen Sie in diesem Zusammenhang sicher, dass Sie @Configurable nicht für Bean-Klassen verwenden, die mit @Scheduled annotiert und als reguläre Spring-Beans mit dem Container registriert sind: Andernfalls erhalten Sie eine doppelte Initialisierung, einmal durch den Container und einmal durch den @Configurable-Aspekt , mit der Folge, dass jede @Scheduled-Methode zweimal aufgerufen wird.

Ich verstehe, dass dies an dieser Stelle nur ein Vorschlag ist, aber ich glaube nicht, dass wir genügend Informationen haben, um das Problem weiter zu diagnostizieren.

  • Ok, also genau in welcher Klasse soll die geplante Methode dann deklariert werden? Wenn ich es in einer mit @Service annotierten Klasse habe, bekomme ich dieses Verhalten/

    – demaniak

    5. Oktober 2014 um 17:22 Uhr

  • In meinem Fall wollte ich die geplante Funktion auch manuell mit @WebServlet aufrufen

    – ropo

    1. März 2017 um 9:30 Uhr

Benutzer-Avatar
Benutzer2408678

Ich weiß die Antwort!!

Initialisieren Sie Ihren Zeitplan nicht zweimal

Plündere dein Weblog:

WebApplicationContext einmal und einmal servlet

also bei dir servlet.xml mach das nicht so

import resource="classpath:applicationContext.xml"

Ich habe meine Klasse als “Service” deklariert und auch die Annotation @Scheduled verwendet, um sie als Scheduler zu deklarieren. Der Scheduler ruft es normal auf, aber wir haben die Klasse als Dienst deklariert. Es wurde zweimal initiiert.

Ich habe die Service-Anmerkung entfernt. Und deklarierte diese Klasse als Bean im Kontext-XML, das ich gepflegt habe. (benutzerdefiniertes Kontext-XML, das in web.xml deklariert ist). Dies hat das Problem für mich behoben. Hoffe es hilft jemandem.

es geschieht wegen des Kontext-Listeners

Einfach entfernen

< listener-class >org.springframework.web.context.ContextLoaderListener< /listener-class >

< /Zuhörer >

aus web.xml sollte es funktionieren.

Ich bin auf ein ähnliches Problem gestoßen. Es könnte an den folgenden Gründen liegen.

  1. Ein Fehler in den Frühlingsversionen
    https://jira.spring.io/browse/SPR-10830

  2. Kontext wird zweimal geladen.

  3. Die log4j.xml schreibt die Protokolle zweimal. Es ist in meinem Fall passiert, nicht sicher über Ihren. Wenn Sie die anderen Optionen ausprobiert haben, versuchen Sie es auch mit dieser.

Benutzer-Avatar
Gemeinschaft

Ich hatte das gleiche Problem und fand schließlich heraus, dass das Problem darauf zurückzuführen war, dass die Beans in erstellt wurden root context ebenso wie servlet context.

Um dies zu beheben, müssen Sie die Erstellung der Beans in die entsprechenden Kontexte aufteilen.

Diese Antwort erklärt wirklich gut, wie das geht, und hat mein Problem behoben.

Benutzer-Avatar
Ciberkinder

Ich hatte ein ähnliches Problem, ich habe meins so gelöst:

package com.sample.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;

@Configuration
@EnableScheduling
public class JobExecutorConfig {
}

als Konfiguration für Spring Boot. Und ich füge dies als Jobklasse hinzu:

package com.sample.jobs;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class Job {

  private final Logger log = LoggerFactory.getLogger(this.getClass());

  @Autowired
  MyOtherClass moc;

  @Scheduled(fixedRate = 60000) // every 60 seconds
  public void doJob() {
    log.debug("Job running !!!");
    try {
     moc.doSomething()
    } catch (Exception e) {
      log.error(e.getMessage());
    }
    finally {

      log.debug("job Done !!!");
    }

  }

  // examples of other CRON expressions
  // * "0 0 * * * *" = the top of every hour of every day.
  // * "*/10 * * * * *" = every ten seconds.
  // * "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
  // * "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
  // * "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
  // * "0 0 0 25 12 ?" = every Christmas Day at midnight
}

  • Es wird immer noch zweimal ausgeführt, ich habe es genau nach Ihrem Vorschlag gemacht, aber es hat nicht so funktioniert

    – iamrajshah

    16. Januar 2019 um 9:15 Uhr

1014240cookie-checkJava Spring @Scheduled-Aufgaben werden zweimal ausgeführt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy