En guide till vårschemaläggaren

1. Översikt

I den här artikeln kommer vi att diskutera mekanismerna för schemaläggning av våren - TaskScheduler och dess förbyggda implementeringar tillsammans med de olika utlösarna som ska användas. Om du vill läsa mer om schemaläggning på våren, kolla in artiklarna @ Async och @ Schemalagda .

TaskScheuler introducerades under våren 3.0 med en mängd olika metoder att köra någon gång i framtiden, det returnerar också ett representationsobjekt för ScheduledFuture- gränssnittet, som kan användas för att avbryta schemalagd uppgift eller kontrollera om det är gjort eller inte.

Allt vi behöver göra är att välja en körbar uppgift för schemaläggning och sedan välja en lämplig schemaläggningspolicy.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler är väl lämpad för intern trådhantering, eftersom den delegerar uppgifter till ScheduledExecutorService och implementerar TaskExecutor- gränssnittet - så att en enda instans av den kan hantera asynkrona potentiella körningar samt @Scheduled- anteckningen.

Låt oss nu definiera ThreadPoolTaskScheduler bean på 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; } }

Den konfigurerade bean threadPoolTaskScheduler kan utföra uppgifter asynkront baserat på den konfigurerade poolstorleken 5.

Observera att alla ThreadPoolTaskScheduler- relaterade trådnamn kommer att prefixas med ThreadPoolTaskScheduler .

Låt oss implementera en enkel uppgift som vi sedan kan schemalägga:

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()); } } 

Vi kan nu enkelt schemalägga att denna uppgift ska köras av schemaläggaren:

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

Den taskScheduler kommer att schemalägga denna körbart uppgift vid en känd tidpunkt, exakt 3 sekunder efter den aktuella tiden.

Låt oss nu gå lite djupare med planeringsmekanismerna för ThreadPoolTaskScheduler .

3. Schemalägg körbar uppgift med fast fördröjning

Schemaläggning med en fast fördröjning kan göras med två enkla mekanismer:

3.1. Schemaläggning efter en fast fördröjning av den senast planerade utförandet

Låt oss konfigurera en uppgift som ska köras efter en fast fördröjning på 1000 millisekunder:

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

Den RunnableTask kommer alltid köra 1000 millisekunder senare mellan slutförandet av ett utförande och början av nästa.

3.2. Schemaläggning efter en fast fördröjning av ett visst datum

Låt oss konfigurera en uppgift som ska köras efter en fast fördröjning av en given starttid:

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

Den RunnableTask kommer att åberopas vid den angivna exekveringstid som huvudsakligen den tid under vilken @PostConstruct metod börjar och därefter med 1000 millisekunder fördröjning.

4. Schemaläggning till fast pris

Det finns två enkla mekanismer för att schemalägga körbara uppgifter till fast hastighet:

4.1. Schemalägga RunnableTask till en fast takt

Låt oss schemalägga en uppgift så att den körs med en fast takt på millisekunder :

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

Nästa RunnableTask körs alltid efter 2000 millisekunder oavsett status för den senaste körningen som fortfarande kan köras.

4.2. Schemalägga RunnableTask till en fast ränta från ett visst datum

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

Den RunnableTask kommer att köra 3000 millisekunder efter den aktuella tiden.

5. Schemaläggning med CronTrigger

CronTrigger används för att schemalägga en uppgift baserat på ett cronuttryck:

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

Den medföljande utlösaren kan användas för att köra en uppgift enligt en viss kadens eller schema:

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

I det här fallet körs RunnableTask vid den 10: e sekunden av varje minut.

6. Schemaläggning med PeriodicTrigger

Låt oss använda PeriodicTrigger för att schemalägga en uppgift med en fast fördröjning på 2000 millisekunder:

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

Den konfigurerade PeriodicTrigger- bönan skulle användas för att köra en uppgift efter en fast fördröjning på 2000 millisekunder.

Låt oss nu schemalägga RunnableTask med PeriodicTrigger :

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

Vi kan också konfigurera PeriodicTrigger så att den initialiseras med en fast takt snarare än med fast fördröjning, och vi kan också ställa in en initial fördröjning för den första schemalagda uppgiften med en given millisekunder.

Allt vi behöver göra är att lägga till två rader kod före returuttalande vid periodicTrigger bean :

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

Vi använde metoden setFixedRate för att schemalägga uppgiften till fast hastighet snarare än med en fast fördröjning, sedan används metoden setInitialDelay för att bara ställa in initialfördröjning för den första körbara uppgiften som ska köras.

7. Slutsats

I den här snabba artikeln har vi illustrerat hur man schemalägger en körbar uppgift med hjälp av vårstöd för uppgifter.

Vi tittade på att köra uppgiften med en fast fördröjning, med en fast hastighet och enligt en specificerad utlösare.

Och som alltid är koden tillgänglig som ett Maven-projekt i GitHub.