De @ geplande annotatie in het voorjaar

1. Overzicht

In deze tutorial laten we zien hoe de lente @Gepland annotatie kan worden gebruikt om taken te configureren en te plannen.

De eenvoudige regels die we moeten volgen om een ​​methode te annoteren @Gepland zijn:

  • een methode moet de leegte retourtype
  • een methode mag geen parameters accepteren

2. Schakel ondersteuning voor planning in

Om ondersteuning voor het plannen van taken en het @Verwacht annotatie in het voorjaar kunnen we de annotatie in Java-inschakelstijl gebruiken:

@Configuration @EnableScheduling openbare klasse SpringConfig {...}

Omgekeerd kunnen we hetzelfde doen in XML:

3. Plan een taak met een vaste vertraging

Laten we beginnen met het configureren van een taak die na een vaste vertraging moet worden uitgevoerd:

@Scheduled (fixedDelay = 1000) public void scheduleFixedDelayTask () {System.out.println ("Vaste vertragingstaak -" + System.currentTimeMillis () / 1000); }

In dit geval is de duur tussen het einde van de laatste uitvoering en het begin van de volgende uitvoering vast. De taak wacht altijd totdat de vorige is voltooid.

Deze optie moet worden gebruikt wanneer het verplicht is dat de vorige uitvoering is voltooid voordat deze opnieuw wordt uitgevoerd.

4. Plan een taak tegen een vast tarief

Laten we nu een taak uitvoeren met een vast tijdsinterval:

@Scheduled (fixedRate = 1000) public void scheduleFixedRateTask () {System.out.println ("Fixed rate task -" + System.currentTimeMillis () / 1000); }

Deze optie moet worden gebruikt wanneer elke uitvoering van de taak onafhankelijk is.

Houd er rekening mee dat geplande taken niet standaard parallel worden uitgevoerd. Dus zelfs als we gebruikten vaste rente, wordt de volgende taak niet aangeroepen totdat de vorige is voltooid.

Als we parallel gedrag in geplande taken willen ondersteunen, moeten we het @Async annotatie:

@EnableAsync openbare klasse ScheduledFixedRateExample {@Async @Scheduled (fixedRate = 1000) public void scheduleFixedRateTaskAsync () gooit InterruptedException {System.out.println ("Fixed rate task async -" + System.currentTimeMillis () / 1000); Thread.sleep (2000); }}

Nu wordt deze asynchrone taak elke seconde aangeroepen, zelfs als de vorige taak niet is voltooid.

5. Vaste rente versus vaste vertraging

We kunnen een geplande taak uitvoeren met Spring's @Verwacht annotatie, maar op basis van de eigenschappen fixedDelay en vaste rente, de aard van de uitvoering verandert.

De fixedDelay property zorgt ervoor dat er een vertraging is van n milliseconde tussen de eindtijd van een uitvoering van een taak en de starttijd van de volgende uitvoering van de taak.

Deze eigenschap is met name handig als we ervoor moeten zorgen dat er altijd maar één exemplaar van de taak wordt uitgevoerd. Voor afhankelijke banen is het erg nuttig.

De vaste rente eigenschap voert de geplande taak bij elke n milliseconde. Het controleert niet op eerdere uitvoeringen van de taak.

Dit is handig wanneer alle uitvoeringen van de taak onafhankelijk zijn. Als we niet verwachten de grootte van het geheugen en de threadpool te overschrijden, vaste rente zou best handig moeten zijn.

Hoewel, als de inkomende taken niet snel worden voltooid, is het mogelijk dat ze eindigen met de "Geheugen-uitzondering".

6. Plan een taak met aanvankelijke vertraging

Laten we vervolgens een taak plannen met een vertraging (in milliseconden):

@Scheduled (fixedDelay = 1000, initialDelay = 1000) public void scheduleFixedRateWithInitialDelayTask () {lang nu = System.currentTimeMillis () / 1000; System.out.println ("Vaste taak met een eerste vertraging van één seconde -" + nu); }

Merk op hoe we beide gebruiken fixedDelay net zoals initialDelay in dit voorbeeld. De taak wordt de eerste keer uitgevoerd na de initialDelay waarde, en het zal verder worden uitgevoerd volgens de fixedDelay.

Deze optie is handig als de taak een configuratie heeft die moet worden voltooid.

7. Plan een taak met behulp van cron-expressies

Soms zijn vertragingen en tarieven niet genoeg, en hebben we de flexibiliteit van een cron-expressie nodig om de planning van onze taken te beheersen:

@Scheduled (cron = "0 15 10 15 *?") Public void scheduleTaskUsingCronExpression () {lang nu = System.currentTimeMillis () / 1000; System.out.println ("taken plannen met behulp van cron jobs -" + nu); }

Merk op dat we in dit voorbeeld plannen dat een taak wordt uitgevoerd om 10:15 uur op de 15e van elke maand.

Spring gebruikt standaard de lokale tijdzone van de server voor de cron-expressie. Echter, we kunnen de zone attribuut om deze tijdzone te wijzigen:

@Scheduled (cron = "0 15 10 15 *?", Zone = "Europe / Paris")

Met deze configuratie plant Spring de geannoteerde methode om te draaien om 10:15 uur op de 15e dag van elke maand in de tijd van Parijs.

8. Parametrisering van het schema

Het hardcoderen van deze schema's is eenvoudig, maar we moeten meestal de planning kunnen beheren zonder de hele app opnieuw te compileren en te implementeren.

We maken gebruik van Spring Expressions om de configuratie van de taken te externaliseren, en we slaan deze op in eigenschappenbestanden.

EEN fixedDelay taak:

@Scheduled (fixedDelayString = "$ {fixedDelay.in.milliseconds}")

EEN vaste rente taak:

@Scheduled (fixedRateString = "$ {fixedRate.in.milliseconds}")

EEN cron op expressie gebaseerde taak:

@Scheduled (cron = "$ {cron.expression}")

9. Geplande taken configureren met XML

Spring biedt ook een XML-manier om de geplande taken te configureren. Hier is de XML-configuratie om deze in te stellen:

10. Conclusie

In dit artikel hebben we de weg naar configureer en gebruik de @Verwacht annotatie.

We hebben het proces besproken om planning mogelijk te maken en verschillende manieren om taakpatronen voor planning in te stellen.

De bovenstaande voorbeelden zijn te vinden op GitHub.