Een gids voor de Spring Task Scheduler

1. Overzicht

In dit artikel bespreken we de Mechanismen voor het plannen van taken in de lenteTaakplanner en het zijn vooraf gebouwde implementaties samen met de verschillende te gebruiken triggers. Als je meer wilt lezen over roosteren in het voorjaar, kijk dan op @Async en @Verwacht Lidwoord.

TaskScheuler werd geïntroduceerd in Spring 3.0 met een verscheidenheid aan methoden die op een bepaald moment in de toekomst kunnen worden uitgevoerd, het retourneert ook een representatieobject van Geplande toekomst interface, die kan worden gebruikt om geplande taken te annuleren of om te controleren of deze is voltooid of niet.

Het enige wat we hoeven te doen is een uitvoerbare taak selecteren voor planning en vervolgens een geschikt planningsbeleid selecteren.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler is zeer geschikt voor het beheer van interne schroefdraden, aangezien het taken delegeert aan het ScheduledExecutorService en implementeert het Taakuitvoerder interface - zodat een enkele instantie ervan zowel asynchrone potentiële uitvoeringen als de @Verwacht annotatie.

Laten we nu definiëren ThreadPoolTaskScheduler boon bij ThreadPoolTaskSchedulerConfig:

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

De geconfigureerde boon threadPoolTaskScheduler kan taken asynchroon uitvoeren op basis van de geconfigureerde poolgrootte van 5.

Merk op dat alles ThreadPoolTaskScheduler gerelateerde threadnamen worden voorafgegaan door ThreadPoolTaskScheduler.

Laten we een eenvoudige taak implementeren die we vervolgens kunnen plannen:

klasse RunnableTask implementeert Runnable {privé String-bericht; openbare RunnableTask (String-bericht) {this.message = bericht; } @Override public void run () {System.out.println (nieuwe datum () + "Runnable Task with" + message + "on thread" + Thread.currentThread (). GetName ()); }} 

We kunnen deze taak nu eenvoudig plannen zodat deze door de planner wordt uitgevoerd:

taskScheduler.schedule (nieuwe Runnabletask ("Specifieke tijd, 3 seconden vanaf nu"), nieuwe datum (System.currentTimeMillis + 3000)); 

De taakplanner zal deze uitvoerbare taak plannen op een bekende datum, precies 3 seconden na de huidige tijd.

Laten we nu wat dieper ingaan op de ThreadPoolTaskScheduler planningsmechanismen.

3. Plan een uitvoerbare taak met vaste vertraging

Plannen met een vaste vertraging kan worden gedaan met twee eenvoudige mechanismen:

3.1. Planning na een vaste vertraging van de laatste geplande uitvoering

Laten we een taak configureren om te worden uitgevoerd na een vaste vertraging van 1000 milliseconden:

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

De RunnableTask zal altijd 1000 milliseconden later draaien tussen de voltooiing van de ene uitvoering en het begin van de volgende.

3.2. Planning na een vaste vertraging van een specifieke datum

Laten we een taak configureren om te worden uitgevoerd na een vaste vertraging van een bepaalde starttijd:

taskScheduler.scheduleWithFixedDelay (nieuwe RunnableTask ("Huidige datum vast 1 seconde vertraging"), nieuwe datum (), 1000);

De RunnableTask wordt aangeroepen op de opgegeven uitvoeringstijd, voornamelijk de tijd waarin @PostConstruct methode start en vervolgens met 1000 milliseconden vertraging.

4. Plannen tegen een vast tarief

Er zijn twee eenvoudige mechanismen voor het plannen van uitvoerbare taken tegen een vast tarief:

4.1. Plannen van het RunnableTask tegen een vast tarief

Laten we een taak plannen om uit te voeren op een vaste snelheid van milliseconden:

taskScheduler.scheduleAtFixedRate (nieuwe RunnableTask ("Vaste snelheid van 2 seconden"), 2000);

De volgende RunnableTask wordt altijd uitgevoerd na 2000 milliseconden, ongeacht de status van de laatste uitvoering die mogelijk nog actief is.

4.2. Plannen van het RunnableTask tegen een vast tarief vanaf een bepaalde datum

taskScheduler.scheduleAtFixedRate (nieuwe RunnableTask ("Vaste snelheid van 2 seconden"), nieuwe datum (), 3000);

De RunnableTask loopt 3000 milliseconden na de huidige tijd.

5. Plannen met CronTrigger

CronTrigger wordt gebruikt om een ​​taak te plannen op basis van een cron-expressie:

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

De meegeleverde trigger kan worden gebruikt om een ​​taak uit te voeren volgens een bepaalde opgegeven cadans of schema:

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

In dit geval is het RunnableTask wordt uitgevoerd op de 10e seconde van elke minuut.

6. Plannen met PeriodicTrigger

Laten we gebruiken PeriodicTrigger voor het plannen van een taak met een vaste vertraging van 2000 milliseconden:

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

De geconfigureerde PeriodicTrigger bean zou worden gebruikt om een ​​taak uit te voeren na een vaste vertraging van 2000 milliseconde.

Laten we nu het RunnableTask met de PeriodicTrigger:

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

We kunnen ook configureren PeriodicTrigger om te worden geïnitialiseerd met een vaste snelheid in plaats van een vaste vertraging, kunnen we ook een initiële vertraging instellen voor de eerste geplande taak met een gegeven milliseconden.

Het enige wat we hoeven te doen is twee regels code toe te voegen vóór de return-instructie op de periodicTrigger Boon:

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

We gebruikten de setFixedRate methode om de taak in te plannen met een vast tarief in plaats van met een vaste vertraging setInitialDelay methode wordt gebruikt om de initiële vertraging alleen in te stellen voor de eerste uitvoerbare taak die moet worden uitgevoerd.

7. Conclusie

In dit korte artikel hebben we geïllustreerd hoe u een uitvoerbare taak kunt plannen met behulp van de Spring-ondersteuning voor taken.

We hebben gekeken naar het uitvoeren van de taak met een vaste vertraging, tegen een vaste snelheid en volgens een gespecificeerde trigger.

En, zoals altijd, is de code beschikbaar als een Maven-project in GitHub.