Technologieaustausch

SpringBoot täglich: Die @Scheduled-Implementierung wird einmal ausgeführt, wenn der Dienst gestartet wird

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Apropos geplante Aufgaben: Wir sollten an @Scheduled, Quartz und XXL-JOB denken. Einige einzelne Dienste oder kleine Projekte können jedoch aus Bequemlichkeits- und Geschwindigkeitsgründen direkt @Scheduled verwenden, um asynchrone Aufgaben zu implementieren. Daher werden die Theme-Anforderungen dieses Artikels erweitert.

Wenn @Scheduled in einem Projekt verwendet wird, wie kann die angegebene asynchrone Aufgabe im Voraus ausgeführt werden, wenn das Projekt gestartet wird?

1. Detaillierte Erklärung von @Scheduled

Die @Scheduled-Annotation unterstützt mehrere Parameter zur flexiblen Steuerung der Aufgabenausführungszeit.

  • cron: Cron-Ausdruck, der Sekunden, Minuten, Stunden, Tage, Monate, Wochen usw. genau steuern kann.
    Fügen Sie hier eine Bildbeschreibung ein
  • Zone: Erhalten Sie eine Zeitzone, z. B. Asien/Shanghai, die von uns normalerweise verwendete Zeitzone. Normalerweise lassen wir dieses Feld leer.
  • FixedDelay: Gibt an, wie lange nach dem letzten Ausführungszeitpunkt die Ausführung erneut ausgeführt wird. Wie zum Beispiel @Scheduled(fixedDelay = 5000)
  • FixedDelayString: hat die gleiche Bedeutung wie FixedDelay, jedoch in Form einer Zeichenfolge. Der einzige Unterschied besteht darin, dass Platzhalter wie @Scheduled(fixedDelayString = "5000") unterstützt werden.
  • FixedRate: Wie lange nach dem letzten Start der Ausführungszeit, z. B. @Scheduled(fixedRate = 5000)
  • FixedRateString: hat die gleiche Bedeutung wie FixedRate, jedoch in Form einer Zeichenfolge. Der einzige Unterschied besteht darin, dass Platzhalter unterstützt werden.
  • initialDelay: Wie lange die Ausführung zum ersten Mal verzögert werden soll, beträgt die erste Verzögerung vor der Ausführung alle 5 Sekunden gemäß der FixedRate-Regel )
  • initialDelayString: hat die gleiche Bedeutung wie initialDelayString, jedoch in Form einer Zeichenfolge. Der einzige Unterschied besteht darin, dass Platzhalter unterstützt werden.

2. Logikimplementierung

1. Erstellen Sie eine Logikmethode für geplante Aufgaben

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Erstellen Sie eine neue Startausführungsklasse

Diese Klasse ruft beim Start hauptsächlich die angegebene Aufgabenmethode manuell auf

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Hinweis: Denken Sie daran, @EnableScheduling zur Startklasse hinzuzufügen, damit die geplante Aufgabe ausgeführt wird. Dies hat natürlich keinen Einfluss auf den Logiktest dieses Artikels.

3. Testergebnisse

Sehen Sie sich nach dem Start des Dienstes die Druckinformationen an
Fügen Sie hier eine Bildbeschreibung ein