Eine Anleitung zum Spring Task Scheduler

1. Übersicht

In diesem Artikel werden die Spring- Taskplanungsmechanismen - TaskScheduler und seine 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 im Frühjahr 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 der ScheduledFuture- Schnittstelle zurückgegeben, mit dem geplante Aufgaben abgebrochen oder überprüft werden können, ob sie erledigt sind 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 an den ScheduledExecutorService delegiert und die TaskExecutor- Schnittstelle implementiert, sodass eine einzelne Instanz davon asynchrone potenzielle Ausführungen sowie die Annotation @Scheduled verarbeiten kann .

Definieren wir nun die ThreadPoolTaskScheduler- Bean in ThreadPoolTaskSchedulerConfig :

@Configuration @ComponentScan( basePackages="com.baeldung.taskscheduler", basePackageClasses={ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(5); threadPoolTaskScheduler.setThreadNamePrefix( "ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; } }

Der konfigurierte Bean threadPoolTaskScheduler kann Aufgaben basierend auf der konfigurierten Poolgröße von 5 asynchron ausführen.

Beachten Sie, dass allen ThreadPoolTaskScheduler- bezogenen Threadnamen ThreadPoolTaskScheduler vorangestellt wird .

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 diese Aufgabe jetzt einfach so planen, dass sie vom Scheduler ausgeführt wird:

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

Der taskScheduler plant diese ausführbare Aufgabe zu einem bekannten Datum, genau 3 Sekunden nach der aktuellen Zeit.

Lassen Sie uns nun die ThreadPoolTaskScheduler- Planungsmechanismen etwas genauer betrachten .

3. Planen Sie eine ausführbare Aufgabe mit fester Verzögerung

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

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

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

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

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

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

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

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

Die RunnableTask wird zur angegebenen Ausführungszeit aufgerufen, hauptsächlich zu der Zeit, zu der die @ PostConstruct- Methode gestartet wird, und anschließend mit einer Verzögerung von 1000 Millisekunden.

4. Planen Sie zu einem festen Preis

Es gibt zwei einfache Mechanismen zum Planen von ausführbaren Aufgaben mit fester Rate:

4.1. Planen der RunnableTask mit einer festen Rate

Planen wir eine Aufgabe so, dass sie mit einer festen Rate von Millisekunden ausgeführt wird :

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

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

4.2. Planen der RunnableTask mit einer festen Rate ab einem bestimmten Datum

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

Die RunnableTask wird 3000 Millisekunden nach der aktuellen Zeit ausgeführt.

5. Planen mit CronTrigger

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

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

Der bereitgestellte Trigger 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 wird die RunnableTask in der 10. Sekunde jeder Minute ausgeführt.

6. Planen mit PeriodicTrigger

Verwenden wir PeriodicTrigger zum Planen einer Aufgabe mit einer festen Verzögerung von 2000 Millisekunden:

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

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

Planen wir nun die RunnableTask mit dem PeriodicTrigger :

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

Wir können PeriodicTrigger auch so konfigurieren , dass es mit einer festen Rate anstatt mit einer festen Verzögerung initialisiert wird. 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, vor der return-Anweisung in der periodicTrigger- Bean zwei Codezeilen hinzuzufügen :

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

We used the setFixedRate method to schedule the task at fixed rate rather than with a fixed delay, then setInitialDelay method is used to set initial delay only for the first runnable task to run.

7. Conclusion

In this quick article, we've illustrated how to schedule a runnable task using the Spring support for tasks.

We looked at running the task with a fixed delay, at a fixed rate and according to a specified trigger.

And, as always, the code is available as a Maven project over in GitHub.