Tekniken förändras ständigt dag för dag. Ibland måste vi utföra ett jobb med jämna mellanrum på servern. Att köra jobbet på servern manuellt är en svår uppgift så det kan inte göras flera gånger av användaren eller administratören. För att lösa detta problem, Cron hjälper programmeraren att utföra ett jobb med jämna mellanrum på servern. Det används ofta för automatiserat systemunderhåll och beundran. Utöver detta kan vi också använda Cron uttryck inom webbutveckling. Det finns många situationer när en webbapplikation kan behöva utföra en viss uppgift med jämna mellanrum.
I det här avsnittet kommer vi att diskutera Java Cron uttryck , det fungerar och genomförs Java Quartz schemaläggare .
Vad är Cron?
I grund och botten är Cron ett verktyg som schemalägger en uppgift. Det låter användaren schemalägga en uppgift med jämna mellanrum vid angiven tid, datum, månad, svag och år. Det används ofta i automatiserade processer där mänskligt ingripande inte krävs.
numrera alfabetet
Cron uttryck
I Java används Cron-uttryck för att konfigurera instanser av CronTrigger klass. Det är en underklass av org.quartz.Trigger klass. Ett Cron-uttryck är en sträng eller ett uttryck som består av sex eller sju fält (tidsenhet). Den beskriver individuella detaljer om schemat och kommandot.
Ett cron-uttryck kan vara enkelt såväl som komplext. Till exempel,
Enkel: * * * * ? * (asterisk anger fält)
Komplex: 0 0/4 12,15,3-35,52 ? Maj, juni, juli TI-LÖR 2002-2010.
Observera också att ett Cron-uttryck kan skrivas i olika stilar, enligt följande. Till exempel har följande tre Cron-uttryck samma betydelse.
- 0 10 9 ? **
- 0 10 9 * * ?
- 0 10 9 * * ? *
Alla de tre uttrycken körs klockan 9:10 varje dag.
Fält som används i Cron-uttryck
I Cron-uttryck är tidsenhet känd som fält . Dessa är åtskilda av blanksteg, kan innehålla vilket som helst av de tillåtna värdena med olika kombinationer av tillåtna tecken för det fältet. Den visar fälten i förväntad ordning. Följande tabell visar tidsenheten och motsvarande värden och symboler som kan användas med uttrycken.
Fält namn | Nödvändig | Tillåtna värden | Tillåtna specialtecken och symboler med fält |
---|---|---|---|
Sekunder | Ja | 0-59 | , - * / |
Minuter | Ja | 0-59 | , - * / |
Timmar | Ja | 0-23 | , - * / |
Dag i månaden | Ja | -31 | , - * ? / L W C |
Månad | Ja | 0-11 eller JAN-DEC | , - * / |
Dag i veckan | Ja | 1-7 eller SÖN-LÖR | , - * ? / L C # |
År | Frivillig | tom eller 1970-2099 | , - * / |
Specialsymboler och bokstäver som används i Cron-uttryck
Asterisk (*): Symbolen används när vi vill utföra händelse vid varje tidsenhet (minut, sekund, timme). Till exempel, om * används med minuttidsenhet betyder det att en händelse kommer att köras varje minut, automatiskt.
Frågetecken (?): Symbolen används i fälten som dag i månaden och veckodag. Det anger det godtyckliga värdet och ignorerar fältvärdet. Anta att vi vill köra ett skript den 2:a varje månad utan att bry oss om vilken veckodag som infaller den 2:a dagen i månaden. I det här fallet bör vi ange en frågeteckensymbol ( ?) i fältet veckodag.
Bindestreck (-): Symbolen används för att specificera intervallet. Det bestämmer värdeintervallet. Till exempel, om ett timfält definieras som , betyder att en händelse kommer att köras vid 4:e och 5:e timmen.
Kommatecken (,): Den används för att definiera värden för fälten separerade med kommatecken. Till exempel fre, lör, sön osv.
Snedstreck (/): Den används för att öka värden för den angivna tidsenheten. Anta att vi vill starta en händelse efter 10 minuter, efter det måste vi utföra samma händelse efter 20 minuter, nästa avrättning efter 30 minuter och så vidare. I det här fallet anger vi starttiden och det inkrementella värdet, separerade med snedstreck.
Till exempel om 10/10 i angivet i minutfältet betyder det att den första händelsen exekveras efter 10 minuter, och nästa exekvering kommer att ske efter 20 minuter av en timme, och så nej.
L (sista): Användningen av L har olika betydelse med olika fält.
- Om den har använts i fältet anger det den sista dagen i månaden, enligt kalender.
- Om den har använts med ett offsetvärde som L-5 . Det betecknar 5:anthtill sista dagen i kalendermånaden.
- Om den har använts i fältet anger den sista dagen i veckan. Den kan också användas med andra värden i fältet. Till exempel, 7L betecknar förra lördagen .
I: Den senare representerar veckodagarna (måndag till fredag). Den bestämmer den veckodag som ligger närmast den angivna dagen i månaden.
Till exempel, om vi specificerar 5W i fältet dag i månaden betyder det att w bestämmer veckodagen nära 5:anthav månaden.
- Om 5thmånaden är lördag , kommer en händelse att utlösas 9th av månaden.
- Om 5thmånaden är söndag , kommer en händelse att utlösas elvath av månaden.
Det kan finnas ett annat fall. Anta , 1stmånaden är lördag, en händelse kommer att inträffa den 3rdav månaden. Det betyder att händelse eller skript inte kommer att köras under föregående månad.
Hash (#): Det representerar den n:e förekomsten av en veckodag i månaden. Till exempel kan tredje fredagen i månaden anges som 6#3 .
Varför ska vi använda cron-uttryck?
Det finns olika anledningar att använda cron-uttryck. Några av dem är:
- Vi kan förfalla och radera cachade datafiler med vissa intervall.
- Vi kan schemalägga dagliga nyhetsbrev och e-post.
- Vi kan schemalägga långvariga uppgifter att köras från ett kommandoradsskript istället för att köra det från ett webbskript. Som att koda videor eller skicka ut massutskick av e-post.
Exempel på Cron-uttryck
Låt oss se några vanliga Cron-uttryck som använder speciella symboler och fält.
Cron uttryck | Betydelsen av Cron Expressions |
---|---|
0 12 * * ? | Det anger att ett jobb kommer att utföras klockan 12:00 (middag) varje dag. |
0/5 13,18 * * ? | Det anger att ett jobb kommer att köras var femte minut med början kl 13.00 och slutar kl. 13.55 och sedan kl. 18.00 och slutar kl. 18.55, varje dag. |
0-5 13 * * ? | Det anger att ett jobb kommer att köras varje minut som börjar kl. 13.00 och slutar kl. 13.05, varje dag. |
15,45 13 ? 6 tis | Det anger att ett jobb kommer att utföras 13:15 och 13:45 varje tisdag i juni månad. |
30 9? * MÅN-FRE | Det anger att ett jobb kommer att utföras kl. 9:30 varje måndag, tisdag, onsdag, torsdag och fredag. |
30 9 15 * ? | Det anger att ett jobb kommer att utföras klockan 9:30 den 15:e dagen i varje månad. |
0 18 L * ? | Det anger att ett jobb kommer att utföras kl. 18.00 den sista dagen i varje månad. |
0 18 L-3 * ? | Det anger att ett jobb kommer att utföras kl. 18.00 den tredje till sista dagen i varje månad. |
30 10 ? *5L | Det anger att ett jobb kommer att utföras klockan 10:30 den sista torsdagen i varje månad. |
0 10 ? * 23 | Det anger att ett jobb kommer att utföras kl. 10.00 den tredje måndagen i varje månad. |
0 0 10/5 * ? | Det anger att ett jobb kommer att utföras vid midnatt klockan 12 varje dag i fem dagar från och med den tionde dagen i månaden. |
0 11 11 11 11 ? | Det anger att ett jobb kommer att utföras varje 11 november kl. 11:11 |
0 15 10 ? * 6L 2002-2005 | Brand klockan 10:15 var sista fredag i varje månad under åren 2002, 2003, 2004 och 2005. |
0 0 0 ? * MIN#1 | Det anger att ett jobb kommer att utföras den första måndagen i månaden vid midnatt. |
0 0 0 LW * * | Det anger att ett jobb kommer att utföras sista vardagen i månaden vid midnatt. |
0 0/30 8-10 * * * | Det anger att ett jobb kommer att utföras 8:00, 8:30, 9:00, 9:30, 10:00 och 10:30 varje dag. |
Specialinställning i Cron Expressions
Förutom ovanstående specialsymbol stöder Cron-uttryck även några fördefinierade specialvärden. Dessa värden kan användas istället för fälten.
Använda Cron Expression i Java
Java tillhandahåller ett jobbschemaläggningssystem med öppen källkod som schemalägger ett jobb för en specifik tidsenhet. Vi kan ladda ner Quartz Scheduler från den officiella webbplatsen.
När det gäller programmering är jobb en klass som innehåller uppgiften som ska utföras. Men frågan är hur man schemalägger det. För att schemalägga ett jobb definierar vi en trigger och specificerar när jobbet ska köras.
Om vi vill implementera Quartz Scheduler kan vi lägga till beroendet enligt följande:
org.quartz-scheduler quartz 2.2.1
Obs: Innan du kör följande Java-program, se till att du har lagt till kvarts-2.2.1.burk filen i sökvägen, annars får du ett felmeddelande.
Låt oss se implementeringen av cron expression och jobb genom ett Java-program.
Steg 1: Skapa ett Maven-projekt. Vi har skapat med namnet CronExample .
Steg 2: Inuti projektet, skapa två paket nämligen com.javatpoint.app och com.javatpoint.job . I det första paketet kommer vi att definiera huvudklassen och i det andra paketet kommer vi att definiera jobben (i vårt fall är antalet jobb fem).
Steg 3: Klistra in följande beroende i filen pom.xml. Den laddar automatiskt ner de nödvändiga JAR-filerna för projektet. Pom-filen ser ut så här:
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
Steg 4: Skapa fem jobb (i paketet com.javatpoint.job) som du vill köra. I vårt fall har vi definierat följande fem jobb.
javascript sömn
Job1.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()); } }
Steg 5: Skapa huvudklassen med namnet MyApp.
MyApp.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(); } } }
När vi är klara med alla ovanstående steg ser projektkatalogen ut så här:
Steg 6: Kör ovanstående Java-program för att se resultatet.
Vi observerar att varje jobb utförs med ett visst tidsintervall.