En guide til Spring Task Scheduler

1. Oversigt

I denne artikel vil vi diskutere ForårsprogrammeringsmekanismerTaskScheduler og det er forudbyggede implementeringer sammen med de forskellige udløsere, der skal bruges. Hvis du vil læse mere om planlægning i foråret, skal du kontrollere @Async og @ Planlagt artikler.

TaskScheuler blev introduceret i Spring 3.0 med en række forskellige metoder til at køre på et tidspunkt i fremtiden, returnerer det også et repræsentationsobjekt for Planlagt fremtid interface, som kan bruges til at annullere planlagt opgave eller kontrollere, om den er færdig eller ej.

Alt hvad vi skal gøre er at vælge en kørbar opgave til planlægning og derefter vælge en korrekt planlægningspolitik.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler er velegnet til intern trådhåndtering, da den delegerer opgaver til ScheduledExecutorService og implementerer TaskExecutor interface - så at enkelt forekomst af det er i stand til at håndtere asynkrone potentielle udførelser såvel som @ Planlagt kommentar.

Lad os nu definere ThreadPoolTaskScheduler bønne ved ThreadPoolTaskSchedulerConfig:

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

Den konfigurerede bønne threadPoolTaskScheduler kan udføre opgaver asynkront baseret på den konfigurerede poolstørrelse på 5.

Bemærk, at alle ThreadPoolTaskScheduler relaterede trådnavne bliver forud for ThreadPoolTaskScheduler.

Lad os implementere en simpel opgave, som vi derefter kan planlægge:

klasse RunnableTask implementerer Runnable {privat streng besked; offentlig RunnableTask (strengbesked) {this.message = meddelelse; } @ Override public void run () {System.out.println (ny dato () + "Kørbar opgave med" + meddelelse + "på tråd" + Thread.currentThread (). GetName ()); }} 

Vi kan nu enkelt planlægge, at denne opgave skal udføres af planlæggeren:

taskScheduler.schedule (ny Runnabletask ("Specifik tid, 3 sekunder fra nu"), ny dato (System.currentTimeMillis + 3000)); 

Det taskScheduler planlægger denne kørbare opgave på en kendt dato, nøjagtigt 3 sekunder efter det aktuelle tidspunkt.

Lad os nu gå lidt mere i dybden med ThreadPoolTaskScheduler planlægningsmekanismer.

3. Planlæg kørbar opgave med fast forsinkelse

Planlægning med en fast forsinkelse kan udføres med to enkle mekanismer:

3.1. Planlægning efter en fast forsinkelse af den sidste planlagte udførelse

Lad os konfigurere en opgave, der skal køre efter en fast forsinkelse på 1000 millisekunder:

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

Det RunnableTask kører altid 1000 millisekunder senere mellem afslutningen af ​​en udførelse og starten af ​​den næste.

3.2. Planlægning efter en fast forsinkelse af en bestemt dato

Lad os konfigurere en opgave til at køre efter en fast forsinkelse af et givet starttidspunkt:

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

Det RunnableTask vil blive påberåbt på det specificerede udførelsestidspunkt, som hovedsagelig det tidspunkt, hvor @PostConstruct metoden starter og efterfølgende med 1000 millisekunder forsinkelse.

4. Planlægning til en fast sats

Der er to enkle mekanismer til planlægning af kørbare opgaver til fast hastighed:

4.1. Planlægning af RunnableTask til en fast rente

Lad os planlægge en opgave, der skal køre på en fast sats på millisekunder:

taskScheduler.scheduleAtFixedRate (ny RunnableTask ("Fast hastighed på 2 sekunder"), 2000);

Den næste RunnableTask kører altid efter 2000 millisekunder uanset status for den sidste udførelse, der muligvis stadig kører.

4.2. Planlægning af RunnableTask til en fast rente fra en given dato

taskScheduler.scheduleAtFixedRate (ny RunnableTask ("Fast hastighed på 2 sekunder"), ny dato (), 3000);

Det RunnableTask kører 3000 millisekunder efter den aktuelle tid.

5. Planlægning med CronTrigger

CronTrigger bruges til at planlægge en opgave baseret på et cron-udtryk:

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

Den medfølgende trigger kan bruges til at køre en opgave i henhold til en bestemt specificeret kadence eller tidsplan:

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

I dette tilfælde er RunnableTask udføres i det 10. sekund i hvert minut.

6. Planlægning med Periodisk udløser

Lad os bruge Periodisk udløser til planlægning af en opgave med en fast forsinkelse af 2000 millisekunder:

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

Den konfigurerede Periodisk udløser bønne ville blive brugt til at køre en opgave efter en fast forsinkelse på 2000 millisekunder.

Lad os nu planlægge RunnableTask med Periodisk udløser:

taskScheduler.schedule (ny RunnableTask ("Periodisk udløser"), periodisk udløser);

Vi kan også konfigurere Periodisk udløser for at blive initialiseret med en fast hastighed i stedet for en fast forsinkelse, kan vi også indstille en indledende forsinkelse for den første planlagte opgave med et givet millisekunder.

Alt, hvad vi skal gøre, er at tilføje to linier kode før retursætningen på periodicTrigger bønne:

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

Vi brugte setFixedRate metode til at planlægge opgaven med fast hastighed snarere end med en fast forsinkelse, derefter setInitialDelay Metoden bruges til kun at indstille den indledende forsinkelse for den første opgave, der kan køres.

7. Konklusion

I denne hurtige artikel har vi illustreret, hvordan man planlægger en kørbar opgave ved hjælp af Spring-support til opgaver.

Vi kiggede på at køre opgaven med en fast forsinkelse, med en fast sats og i henhold til en specificeret udløser.

Og som altid er koden tilgængelig som et Maven-projekt i GitHub.