De technologie verandert voortdurend van dag tot dag. Soms moeten we periodiek een taak uitvoeren op de server. Het handmatig uitvoeren van de taak op de server is een moeilijke taak en kan daarom niet meerdere keren door de gebruiker of beheerder worden uitgevoerd. Om dit probleem op te lossen, Cron helpt de programmeur om periodiek een taak op de server uit te voeren. Het wordt veel gebruikt voor geautomatiseerd systeemonderhoud en bewondering. Daarnaast kunnen we ook gebruik maken van Cron-expressie op het gebied van webontwikkeling. Er zijn veel situaties waarin een webapplicatie periodiek een bepaalde taak moet uitvoeren.
In deze sectie bespreken we de Java Cron-expressies , het werkt en de implementatie is voltooid Java Quartz-planner .
Wat is Cron?
Kortom, Cron is een hulpprogramma dat een taak plant. Hiermee kan de gebruiker periodiek een taak plannen op een bepaalde tijd, datum, maand, zwak en jaar. Het wordt veel gebruikt in geautomatiseerde processen waarbij menselijke tussenkomst niet vereist is.
Cron-expressie
In Java worden Cron-expressies gebruikt om exemplaren van de CronTrigger klas. Het is een subklasse van org.quartz.Trigger klas. Een Cron-expressie is een tekenreeks of expressie die bestaat uit zes of zeven velden (tijdseenheid). Het beschrijft individuele details van het schema en de opdracht.
math.random java
Een cron-expressie kan zowel eenvoudig als complex zijn. Bijvoorbeeld,
Eenvoudig: * * * * ? * (sterretje geeft velden aan)
Complex: 0 0/4 12,15,3-35,52 ? Mei, juni, juli DI-ZA 2002-2010.
Houd er ook rekening mee dat een Cron-expressie als volgt in verschillende stijlen kan worden geschreven. De volgende drie Cron-expressies hebben bijvoorbeeld dezelfde betekenis.
- 0 10 9 ? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
Alle drie de expressies worden elke dag om 09:10 uur uitgevoerd.
Velden die worden gebruikt in Cron-expressie
In Cron-expressies staat de tijdseenheid bekend als veld . Deze worden gescheiden door witruimte en kunnen elk van de toegestane waarden bevatten met verschillende combinaties van de toegestane tekens voor dat veld. Het toont de velden in de verwachte volgorde. De volgende tabel toont de tijdseenheid en bijbehorende waarden, en symbolen die bij de uitdrukkingen kunnen worden gebruikt.
Veldnaam | Vereist | Toegestane waarden | Toegestane speciale tekens en symbolen met velden |
---|---|---|---|
Seconden | Ja | 0-59 | , - * / |
Minuten | Ja | 0-59 | , - * / |
Uur | Ja | 0-23 | , - * / |
Dag van de maand | Ja | -31 | , - * ? / L W C |
Maand | Ja | 0-11 of jan-december | , - * / |
Dag van de week | Ja | 1-7 of ZO-ZA | , - * ? / L C # |
Jaar | Optioneel | leeg of 1970-2099 | , - * / |
Speciale symbolen en letters gebruikt in Cron-expressie
Sterretje (*): Het symbool wordt gebruikt wanneer we een gebeurtenis op elke tijdseenheid (minuut, seconde, uur) willen uitvoeren. Als * bijvoorbeeld wordt gebruikt met de minutentijdseenheid, betekent dit dat er automatisch elke minuut een gebeurtenis wordt uitgevoerd.
Vraagteken (?): Het symbool wordt gebruikt in velden zoals de dag van de maand en de dag van de week. Het geeft de willekeurige waarde aan en negeert de veldwaarde. Stel dat we een script op de 2e van elke maand willen uitvoeren, zonder ons er druk over te maken welke dag van de week op de 2e dag van de maand valt. In dit geval moeten we een vraagtekensymbool opgeven ( ?) in het dag van de week-veld.
Koppelteken (-): Het symbool wordt gebruikt om het bereik aan te geven. Het bepaalt het bereik van waarden. Als een uurveld bijvoorbeeld is gedefinieerd als , betekent dat een evenement plaatsvindt op het 4e en 5e uur.
Komma (,): Het wordt gebruikt om waarden van de velden te definiëren, gescheiden door een komma. Bijvoorbeeld vrijdag, zaterdag, zondag, enz.
Schuine streep naar voren (/): Het wordt gebruikt om waarden van de opgegeven tijdseenheid te verhogen. Stel dat we een gebeurtenis na 10 minuten willen starten, daarna moeten we dezelfde gebeurtenis na 20 minuten uitvoeren, de volgende uitvoering na 30 minuten, enzovoort. In dit geval specificeren we de starttijd en de incrementele waarde, gescheiden door een schuine streep.
Bijvoorbeeld als 10/10 Als u dit in het minutenveld specificeert, betekent dit dat de eerste gebeurtenis na 10 minuten wordt uitgevoerd, en dat de volgende uitvoering na 20 minuten van een uur plaatsvindt, en dus nee.
L (laatste): Het gebruik van L heeft verschillende betekenissen bij verschillende velden.
- Als het is gebruikt in de veld, het geeft de laatste dag van de maand aan, volgens de kalender.
- Als het is gebruikt met een offsetwaarde zoals L-5 . Het duidt de 5 aanetot de laatste dag van de kalendermaand.
- Als het is gebruikt in de veld, geeft dit de laatste dag van de week aan. Het kan ook worden gebruikt met andere waarden in het veld. Bijvoorbeeld, 7L geeft de afgelopen zaterdag .
IN: De laatste vertegenwoordigt de weekdagen (maandag tot en met vrijdag). Het bepaalt de weekdag die het dichtst bij de opgegeven dag van de maand ligt.
Als we bijvoorbeeld specificeren 5W in het dag van de maand-veld betekent dit dat w de weekdag dichtbij de 5 bepaaltevan de maand.
- Als de 5evan de maand is Zaterdag , wordt een gebeurtenis geactiveerd 9e van de maand.
- Als de 5evan de maand is Zondag , wordt een gebeurtenis geactiveerd elfe van de maand.
Er kan nog een ander geval bestaan. Veronderstellen , 1stvan de maand is zaterdag, er vindt een evenement plaats op 3rdvan de maand. Dit betekent dat de gebeurtenis of het script de afgelopen maand niet zal worden uitgevoerd.
Hekje (#): Het vertegenwoordigt de zoveelste keer dat een weekdag van de maand voorkomt. De derde vrijdag van de maand kan bijvoorbeeld worden aangegeven als 6#3 .
Waarom moeten we cron-expressies gebruiken?
Er zijn verschillende redenen om cron-expressies te gebruiken. Sommige ervan zijn:
- We kunnen gegevensbestanden in de cache met een bepaald interval laten verlopen en wissen.
- We kunnen dagelijkse nieuwsbrieven en e-mails plannen.
- We kunnen plannen dat langlopende taken worden uitgevoerd vanuit een opdrachtregelscript, in plaats van deze vanuit een webscript uit te voeren. Zoals het coderen van video's of het versturen van bulk-e-mails.
Voorbeeld van Cron-expressies
Laten we eens kijken naar enkele algemene Cron-expressies die speciale symbolen en velden gebruiken.
Cron-expressie | Betekenis van Cron-expressies |
---|---|
0 12 * * ? | Het geeft aan dat een taak elke dag om 12:00 uur (middag) wordt uitgevoerd. |
0/5 13,18 * * ? | Het geeft aan dat een taak elke vijf minuten wordt uitgevoerd, beginnend om 13.00 uur en eindigt om 13.55 uur, en vervolgens begint om 18.00 uur en eindigt om 18.55 uur, elke dag. |
0-5 13 * * ? | Het geeft aan dat een taak elke minuut wordt uitgevoerd, beginnend om 13.00 uur en eindigt om 13.05 uur, elke dag. |
15,45 13 ? 6 di | Het geeft aan dat een taak elke dinsdag in de maand juni om 13:15 en 13:45 uur wordt uitgevoerd. |
30 9? * MA-VRIJ | Het geeft aan dat een taak elke maandag, dinsdag, woensdag, donderdag en vrijdag om 9.30 uur wordt uitgevoerd. |
30 9 15 * ? | Het geeft aan dat een taak op de 15e dag van elke maand om 9.30 uur wordt uitgevoerd. |
0 18L* ? | Het geeft aan dat een taak op de laatste dag van elke maand om 18.00 uur wordt uitgevoerd. |
0 18 L-3 * ? | Het geeft aan dat een taak op de derde tot de laatste dag van elke maand om 18.00 uur wordt uitgevoerd. |
30 10 ? *5L | Het geeft aan dat een taak op de laatste donderdag van elke maand om 10.30 uur wordt uitgevoerd. |
0 10 ? * 23 | Het geeft aan dat een taak op de derde maandag van elke maand om 10.00 uur wordt uitgevoerd. |
0 0 10/5 * ? | Het geeft aan dat een taak elke dag om 12.00 uur wordt uitgevoerd gedurende vijf dagen, beginnend op de 10e dag van de maand. |
0 11 11 11 11 ? | Het geeft aan dat een taak elke 11 november om 11:11 uur wordt uitgevoerd |
0 15 10 ? * 6L 2002-2005 | Brand om 10:15 uur op elke laatste vrijdag van elke maand gedurende de jaren 2002, 2003, 2004 en 2005. |
0 0 0 ? * MIJN#1 | Het geeft aan dat een taak op de eerste maandag van de maand om middernacht wordt uitgevoerd. |
0 0 0 LW * * | Het geeft aan dat een taak op de laatste weekdag van de maand om middernacht wordt uitgevoerd. |
0 0/30 8-10 * * * | Het geeft aan dat een taak elke dag om 8:00, 8:30, 9:00, 9:30, 10:00 en 10:30 wordt uitgevoerd. |
Speciale instelling in Cron-expressies
Naast het bovenstaande speciale symbool ondersteunt de Cron-expressie ook enkele vooraf gedefinieerde speciale waarden. Deze waarden kunnen worden gebruikt in plaats van de velden.
Cron-expressie gebruiken in Java
Java biedt een open source taakplanningssysteem dat een taak plant voor een specifieke tijdseenheid. We kunnen Quartz Scheduler downloaden van de officiële site.
In termen van programmeren is job een klasse die de uit te voeren taak bevat. Maar de vraag is hoe je dat moet plannen. Voor het plannen van een taak definiëren we een trigger en specificeren we wanneer de taak wordt uitgevoerd.
Als we Quartz Scheduler willen implementeren, kunnen we de afhankelijkheid als volgt toevoegen:
org.quartz-scheduler quartz 2.2.1
Opmerking: zorg ervoor dat u het volgende Java-programma hebt toegevoegd voordat u het volgende Java-programma uitvoert kwarts-2.2.1.pot bestand in het pad, anders krijgt u een foutmelding.
Laten we eens kijken naar de implementatie van cron-expressie en job via een Java-programma.
Stap 1: Maak een Maven-project. We hebben gemaakt met de naam CronVoorbeeld .
Stap 2: Maak binnen het project twee pakketten, namelijk com.javatpoint.app En com.javatpoint.job . In het eerste pakket definiëren we de hoofdklasse en in het tweede pakket definiëren we de banen (in ons geval is het aantal banen vijf).
Stap 3: Plak de volgende afhankelijkheid in het bestand pom.xml. Het downloadt automatisch de vereiste JAR-bestanden voor het project. Het pom-bestand ziet er als volgt uit:
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
Stap 4: Maak vijf taken (in het pakket com.javatpoint.job) die u wilt uitvoeren. In ons geval hebben we de volgende vijf banen gedefinieerd.
java een string omkeren
Taak1.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job1 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job1 --->>> Hello user! Time is ' + new Date()); } }
Job2.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job2 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job2 --->>> Hello user! Time is ' + new Date()); } }
Job3.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job3 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job3 --->>> Hello user! Time is ' + new Date()); } }
Job4.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job4 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job4 --->>> Hello user! Time is ' + new Date()); } }
Job5.java
package com.javatpoint.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job5 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println('Job5 --->>> Hello user! Time is ' + new Date()); } }
Stap 5: Maak de hoofdklasse met de naam MyApp.
MijnApp.java
package com.javatpoint.app; import org.quartz.CronExpression; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import com.javatpoint.job.Job1; import com.javatpoint.job.Job2; import com.javatpoint.job.Job3; import com.javatpoint.job.Job4; import com.javatpoint.job.Job5; public class MyApp { public static void main(String args[]) { try { JobDetail job1 = JobBuilder.newJob(Job1.class) .withIdentity('job1', 'group1').build(); Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger1', 'group1') .withSchedule(CronScheduleBuilder.cronSchedule('0/5 * * * * ?')) .build(); Scheduler scheduler1 = new StdSchedulerFactory().getScheduler(); scheduler1.start(); scheduler1.scheduleJob(job1, trigger1); JobDetail job2 = JobBuilder.newJob(Job2.class) .withIdentity('job2', 'group2').build(); Trigger trigger2 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger2', 'group2') .withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression('0/7 * * * * ?'))) .build(); Scheduler scheduler2 = new StdSchedulerFactory().getScheduler(); scheduler2.start(); scheduler2.scheduleJob(job2, trigger2); JobDetail job3 = JobBuilder.newJob(Job3.class) .withIdentity('job3', 'group3').build(); Trigger trigger3 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger3', 'group3') .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(13, 46)) .build(); Scheduler scheduler3 = new StdSchedulerFactory().getScheduler(); scheduler3.start(); scheduler3.scheduleJob(job3, trigger3); JobDetail job4 = JobBuilder.newJob(Job4.class) .withIdentity('job4', 'group4').build(); Trigger trigger4 = TriggerBuilder.newTrigger() .withIdentity('cronTrigger4', 'group4') .withSchedule(CronScheduleBuilder.weeklyOnDayAndHourAndMinute(3, 13, 46)) .build(); Scheduler scheduler4 = new StdSchedulerFactory().getScheduler(); scheduler4.start(); scheduler4.scheduleJob(job4, trigger4); JobDetail job5 = JobBuilder.newJob(Job5.class) .withIdentity('job5', 'group5').build(); Trigger trigger5 = TriggerBuilder .newTrigger().withIdentity('cronTrigger5', 'group5') .withSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(28, 13, 46)) .build(); Scheduler scheduler5 = new StdSchedulerFactory().getScheduler(); scheduler5.start(); scheduler5.scheduleJob(job5, trigger5); Thread.sleep(100000); scheduler1.shutdown(); scheduler2.shutdown(); scheduler3.shutdown(); scheduler4.shutdown(); scheduler5.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
Als we klaar zijn met alle bovenstaande stappen, ziet de projectmap er als volgt uit:
Stap 6: Voer het bovenstaande Java-programma uit om de uitvoer te bekijken.
We zien dat elke taak met een specifiek tijdsinterval wordt uitgevoerd.