Eine Anleitung zum Spring Task Scheduler

Eine Anleitung zum Spring Task Scheduler

1. Überblick

In diesem Artikel werden dieSpring task scheduling mechanisms -TaskScheduler und die vorgefertigten Implementierungen sowie die verschiedenen zu verwendenden Trigger erläutert. Wenn Sie mehr über die Planung im Frühjahr erfahren möchten, lesen Sie die Artikel@Async und@Scheduled.

TaskScheuler wurde in Spring 3.0 mit einer Vielzahl von Methoden eingeführt, die zu einem späteren Zeitpunkt ausgeführt werden sollen. Außerdem wird ein Repräsentationsobjekt derScheduledFuture-Schnittstelle zurückgegeben, mit dem geplante Aufgaben abgebrochen oder überprüft werden können getan oder nicht.

Alles, was wir tun müssen, ist, eine ausführbare Aufgabe für die Planung auszuwählen und dann eine geeignete Planungsrichtlinie auszuwählen.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler ** eignet sich gut für die interne Thread-Verwaltung, da es Aufgaben anScheduledExecutorService delegiert und dieTaskExecutor-Schnittstelle implementiert, sodass eine einzelne Instanz davon auch asynchrone potenzielle Ausführungen verarbeiten kann die Annotation@Scheduled.

Definieren wir nunThreadPoolTaskScheduler Bean beiThreadPoolTaskSchedulerConfig: __

@Configuration
@ComponentScan(
  basePackages="org.example.taskscheduler",
  basePackageClasses={ThreadPoolTaskSchedulerExamples.class})
public class ThreadPoolTaskSchedulerConfig {

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
        ThreadPoolTaskScheduler threadPoolTaskScheduler
          = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(5);
        threadPoolTaskScheduler.setThreadNamePrefix(
          "ThreadPoolTaskScheduler");
        return threadPoolTaskScheduler;
    }
}

Die konfigurierten BeanthreadPoolTaskScheduler können Aufgaben basierend auf der konfigurierten Poolgröße von 5 asynchron ausführen.

Beachten Sie, dass allenThreadPoolTaskSchedulerverwandten Thread-NamenThreadPoolTaskScheduler vorangestellt werden.

Lassen Sie uns eine einfache Aufgabe implementieren, die wir dann planen können:

class RunnableTask implements Runnable{
    private String message;

    public RunnableTask(String message){
        this.message = message;
    }

    @Override
    public void run() {
        System.out.println(new Date()+" Runnable Task with "+message
          +" on thread "+Thread.currentThread().getName());
    }
}

Wir können jetzt einfach planen, dass diese Aufgabe vom Scheduler ausgeführt wird:

taskScheduler.schedule(
  new Runnabletask("Specific time, 3 Seconds from now"),
  new Date(System.currentTimeMillis + 3000)
);

DietaskScheduler planen diese ausführbare Aufgabe zu einem bekannten Datum, genau 3 Sekunden nach der aktuellen Zeit.

Lassen Sie uns nun die Planungsmechanismen vonThreadPoolTaskScheduleretwas genauer betrachten.

3. Planen Sie die Aufgabe vonRunnablemit fester Verzögerung

Die Planung mit einer festen Verzögerung kann mit zwei einfachen Mechanismen erfolgen:

3.1. Planung nach einer festen Verzögerung der letzten geplanten Ausführung

Konfigurieren Sie eine Task so, dass sie nach einer festen Verzögerung von 1000 Millisekunden ausgeführt wird:

taskScheduler.scheduleWithFixedDelay(
  new RunnableTask("Fixed 1 second Delay"), 1000);

DieRunnableTask werden immer 1000 Millisekunden später zwischen dem Abschluss einer Ausführung und dem Beginn der nächsten ausgeführt.

3.2. Planung nach einer festen Verzögerung eines bestimmten Datums

Konfigurieren Sie eine Aufgabe so, dass sie nach einer festgelegten Verzögerung einer bestimmten Startzeit ausgeführt wird:

taskScheduler.scheduleWithFixedDelay(
  new RunnableTask("Current Date Fixed 1 second Delay"),
  new Date(),
  1000);

DieRunnableTask werden zur angegebenen Ausführungszeit aufgerufen, hauptsächlich zu der Zeit, zu der die@PostConstruct-Methode startet, und anschließend mit einer Verzögerung von ** 1000 Millisekunden.

4. Scheduling mit einer festen Rate

Es gibt zwei einfache Mechanismen, um ausführbare Aufgaben mit einer festen Rate zu planen:

4.1. Planen DieRunnableTask mit einer festen Rate

Planen wir eine Aufgabe so, dass sie mitfixed rate of milliseconds ausgeführt wird:

taskScheduler.scheduleAtFixedRate(
  new RunnableTask("Fixed Rate of 2 seconds") , 2000);

Die nächstenRunnableTask werden immer nach 2000 Millisekunden ausgeführt, unabhängig vom Status der letzten Ausführung, die möglicherweise noch ausgeführt wird.

4.2. Planen derRunnableTask zu einem festen Kurs ab einem bestimmten Datum

taskScheduler.scheduleAtFixedRate(new RunnableTask(
  "Fixed Rate of 2 seconds"), new Date(), 3000);

DieRunnableTask laufen 3000 Millisekunden nach der aktuellen Zeit.

5. Planen mitCronTrigger

CronTrigger wird verwendet, um eine Aufgabe basierend auf einem Cron-Ausdruck zu planen:

CronTrigger cronTrigger
  = new CronTrigger("10 * * * * ?");

Der bereitgestellte Auslöser kann verwendet werden, um eine Aufgabe gemäß einer bestimmten festgelegten Trittfrequenz oder einem bestimmten Zeitplan auszuführen:

taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);

In diesem Fall werden dieRunnableTask in der 10. Sekunde jeder Minute ausgeführt.

6. Planen mitPeriodicTrigger

Verwenden SiePeriodicTrigger zum Planen einer Aufgabe mitfixed delay von 2000 Millisekunden:

PeriodicTrigger periodicTrigger
  = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);

Die konfiguriertePeriodicTrigger-Bean wird verwendet, um eine Aufgabe nach einer festen Verzögerung von ** 2000 Millisekunden auszuführen.

Planen wir nun dieRunnableTask mit denPeriodicTrigger:

taskScheduler.schedule(
  new RunnableTask("Periodic Trigger"), periodicTrigger);

Wir können auchPeriodicTrigger so konfigurieren, dass sie mit einer festen Rate anstatt mit einer festen Verzögerung initialisiert werden. Außerdem können wir eine anfängliche Verzögerung für die erste geplante Aufgabe um eine bestimmte Millisekunde festlegen.

Alles, was wir tun müssen, ist, zwei Codezeilen vor der return-Anweisung an derperiodicTrigger Bean: hinzuzufügen

periodicTrigger.setFixedRate(true);
periodicTrigger.setInitialDelay(1000);

Wir haben die MethodesetFixedRateverwendet, um die Aufgabe mit einer festen Rate anstatt mit einer festen Verzögerung zu planen. Dann wird die MethodesetInitialDelayverwendet, um die anfängliche Verzögerung nur für die erste ausführbare Aufgabe festzulegen, die ausgeführt werden soll.

7. Fazit

In diesem kurzen Artikel haben wir gezeigt, wie Sie eine ausführbare Aufgabe mithilfe der Spring-Unterstützung für Aufgaben planen.

Wir haben uns vorgenommen, die Aufgabe mit einer festen Verzögerung, einer festen Rate und einem festgelegten Auslöser auszuführen.

Und wie immer ist der Code als Maven-Projektover in GitHub verfügbar.