Technologijos nuolat keičiasi kiekvieną dieną. Kartais iš mūsų reikalaujama periodiškai atlikti užduotį serveryje. Paleisti užduotį serveryje rankiniu būdu yra sudėtinga užduotis, todėl vartotojas ar administratorius negali to atlikti kelis kartus. Norėdami išspręsti šią problemą, Cron padeda programuotojui periodiškai atlikti užduotį serveryje. Jis plačiai naudojamas automatizuotai sistemos priežiūrai ir žavėjimuisi. Be to, mes taip pat galime naudoti Krono išraiška interneto svetainių kūrime. Yra daug situacijų, kai žiniatinklio programai gali tekti periodiškai atlikti tam tikrą užduotį.
Šiame skyriuje aptarsime Java Cron išraiškos , jis veikia ir įgyvendinamas Java Quartz planuoklis .
Kas yra Kronas?
Iš esmės „Cron“ yra programa, kuri suplanuoja užduotį. Tai leidžia vartotojui periodiškai planuoti užduotį nurodytu laiku, datą, mėnesį, silpnumą ir metus. Jis plačiai naudojamas automatizuotame procese, kur nereikia žmogaus įsikišimo.
Krono išraiška
Java, Cron išraiškos naudojamos konfigūruoti egzempliorius CronTrigger klasė. Tai yra poklasis org.quartz.Trigger klasė. Cron išraiška yra eilutė arba išraiška, susidedanti iš šešių ar septynių laukų (laiko vienetas). Jame aprašomos atskiros tvarkaraščio ir komandos detalės.
Cron išraiška gali būti paprasta ir sudėtinga. Pavyzdžiui,
Paprasta: * * * * ? * (žvaigždutė žymi laukus)
Kompleksas: 0 0/4 12,15,3-35,52 ? Gegužė, birželis, liepa TU-ŠE 2002-2010.
Taip pat atkreipkite dėmesį, kad Cron išraiška gali būti parašyta skirtingais stiliais, kaip nurodyta toliau. Pavyzdžiui, šios trys Cron išraiškos turi tą pačią reikšmę.
- 0 10 9? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
Visos trys išraiškos vykdomos kiekvieną dieną 9:10 val.
jsp
Cron išraiškoje naudojami laukai
Cron išraiškose laiko vienetas žinomas kaip lauke . Jie yra atskirti tarpais, gali būti bet kuri iš leistinų reikšmių su įvairiais to lauko leidžiamų simbolių deriniais. Jame laukai rodomi numatyta tvarka. Šioje lentelėje pavaizduotas laiko vienetas ir atitinkamos reikšmės bei simboliai, kuriuos galima naudoti su išraiškomis.
Lauko pavadinimas | Reikalingas | Leidžiamos vertės | Leidžiami specialieji simboliai ir simboliai su laukais |
---|---|---|---|
sekundės | Taip | 0-59 | , - * / |
Minutės | Taip | 0-59 | , - * / |
Valandos | Taip | 0-23 | , - * / |
Mėnesio diena | Taip | -31 | , - * ? / L W C |
Mėnuo | Taip | 0–11 d. arba SAUSIO–GRUOŽIO D | , - * / |
Savaitės diena | Taip | 1-7 arba SEK-ŠE | , - * ? / L C # |
Metai | Neprivaloma | tuščias arba 1970–2099 m | , - * / |
Cron išraiškoje naudojami specialūs simboliai ir raidės
Žvaigždutė (*): Simbolis naudojamas, kai norime vykdyti įvykį kiekvienu laiko vienetu (minutė, sekundė, valanda). Pavyzdžiui, jei * naudojamas su minutės laiko vienetu, tai reiškia, kad įvykis bus vykdomas kiekvieną minutę automatiškai.
Klaustukas (?): Simbolis naudojamas tokiuose laukuose kaip mėnesio diena ir savaitės diena. Ji žymi savavališką reikšmę ir nepaiso laukų reikšmės. Tarkime, kad norime vykdyti scenarijų kiekvieno mėnesio 2 dieną, nesirūpindami, kuri savaitės diena patenka į 2 mėnesio dieną. Tokiu atveju turėtume nurodyti klaustuko simbolį ( ?) savaitės dienos lauke.
Brūkšnelis (-): Simbolis naudojamas diapazonui nurodyti. Jis nustato verčių diapazoną. Pavyzdžiui, jei valandos laukas yra apibrėžtas kaip , reiškia, kad įvykis vyks 4 ir 5 valandą.
Kablelis (,): Jis naudojamas kableliais atskirtų laukų reikšmėms apibrėžti. Pavyzdžiui, penktadienis, šeštadienis, sekmadienis ir kt.
Pasvirasis brūkšnys (/): Jis naudojamas nurodyto laiko vieneto reikšmėms padidinti. Tarkime, įvykį norime pradėti 10 minučių, po to tą patį įvykį turime vykdyti 20 minučių, kitą vykdymą 30 minučių ir pan. Tokiu atveju nurodome pradžios laiką ir prieauginę reikšmę, atskiriant pasviruoju brūkšniu.
Pavyzdžiui, jei 10/10 nurodytame minučių laukelyje, tai reiškia, kad pirmasis įvykis bus vykdomas 10 minučių, o kitas vykdymas bus 20 minučių po valandos, taigi ne.
L (paskutinis): L vartojimas įvairiuose laukuose turi skirtingą reikšmę.
- Jei jis buvo naudojamas lauke, tai žymi paskutinę mėnesio dieną pagal kalendorių.
- Jei jis buvo naudojamas su poslinkio reikšme, pvz L-5 . Tai žymi 5thiki paskutinės kalendorinio mėnesio dienos.
- Jei jis buvo naudojamas lauke, tai reiškia paskutinę savaitės dieną. Jis taip pat gali būti naudojamas su kita lauko verte. Pavyzdžiui, 7L žymi praeitą šeštadienį .
IN: Vėlesnis reiškia darbo dienas (nuo pirmadienio iki penktadienio). Ji nustato savaitės dieną, kuri yra arčiausiai nurodytos mėnesio dienos.
Pavyzdžiui, jei nurodysime 5W Mėnesio dienos lauke tai reiškia w nustato savaitės dieną netoli 5thmėnesio.
- Jei 5thmėnesio yra šeštadienis , įsijungs įvykis 9th mėnesio.
- Jei 5thmėnesio yra sekmadienis , įsijungs įvykis vienuolikath mėnesio.
Gali būti ir kitas atvejis. Tarkime , 1Švmėnesio yra šeštadienis, renginys vyks 3 drdmėnesio. Tai reiškia, kad įvykis arba scenarijus nebus vykdomi praėjusį mėnesį.
Maiša (#): Tai reiškia n-tą mėnesio savaitės dienos atvejį. Pavyzdžiui, trečiasis mėnesio penktadienis gali būti nurodytas kaip 6#3 .
Kodėl turėtume naudoti cron išraiškas?
Yra įvairių priežasčių naudoti cron išraiškas. Kai kurie iš jų yra:
- Tam tikru intervalu galime baigti galioti ir ištrinti talpykloje saugomus duomenų failus.
- Galime suplanuoti kasdienius naujienų laiškus ir el.
- Galime suplanuoti, kad ilgai vykdomos užduotys būtų vykdomos iš komandinės eilutės scenarijaus, o ne pagal žiniatinklio scenarijų. Pavyzdžiui, vaizdo įrašų kodavimas ar masinių el. laiškų siuntimas.
Cron išraiškų pavyzdys
Pažiūrėkime į kai kurias įprastas Cron išraiškas, kuriose naudojamas specialus simbolis ir laukai.
Krono išraiška | Cron išraiškų reikšmė |
---|---|
0 12 * * ? | Tai reiškia, kad darbas bus atliktas kiekvieną dieną 12:00 (vidudienį). |
0/5 13.18 * * ? | Tai reiškia, kad darbas bus vykdomas kas penkias minutes, pradedant 13:55 ir baigiant 13:55, o tada prasideda 18:00 ir baigiasi 18:55, kiekvieną dieną. |
0-5 13 * * ? | Tai reiškia, kad darbas bus vykdomas kiekvieną minutę, pradedant 13 val. ir baigiant 13:05, kiekvieną dieną. |
15,45 13 ? 6 antradienis | Tai reiškia, kad darbas bus vykdomas 13:15 ir 13:45 kiekvieną birželio mėnesio antradienį. |
30 9? * PIRMAD - PE | Tai reiškia, kad darbas bus atliktas 9.30 val. kiekvieną pirmadienį, antradienį, trečiadienį, ketvirtadienį ir penktadienį. |
30 9 15 * ? | Tai reiškia, kad darbas bus atliktas kiekvieno mėnesio 15 dieną 9:30 val. |
0 18 L * ? | Tai reiškia, kad darbas bus atliktas paskutinę kiekvieno mėnesio dieną 18 val. |
0 18 L-3 * ? | Tai reiškia, kad darbas bus atliktas 18 val. nuo trečios iki paskutinės kiekvieno mėnesio dienos. |
30 10? *5L | Tai reiškia, kad darbas bus atliktas kiekvieno mėnesio paskutinį ketvirtadienį 10:30 val. |
0 10? * 23 | Tai reiškia, kad darbas bus atliktas kiekvieno mėnesio trečią pirmadienį 10 val. |
0 0 10/5 * ? | Tai reiškia, kad darbas bus vykdomas 12 val. vidurnakčio kiekvieną dieną penkias dienas, pradedant nuo 10 mėnesio dienos. |
0 11 11 11 11 ? | Tai reiškia, kad darbas bus atliktas kiekvieną lapkričio 11 d. 11:11 val |
0 15 10 ? * 6L 2002-2005 m | Gaisras 2002, 2003, 2004 ir 2005 m. kiekvieną paskutinį kiekvieno mėnesio penktadienį 10.15 val. |
0 0 0? * MANO #1 | Tai reiškia, kad darbas bus atliktas pirmąjį mėnesio pirmadienį vidurnaktį. |
0 0 0 LW * | Tai reiškia, kad darbas bus atliktas paskutinę mėnesio darbo dieną vidurnaktį. |
0 0/30 8-10 | Tai reiškia, kad darbas bus vykdomas kiekvieną dieną 8:00, 8:30, 9:00, 9:30, 10:00 ir 10:30. |
Specialus nustatymas Cron išraiškose
Be aukščiau nurodyto specialaus simbolio, Cron išraiška taip pat palaiko kai kurias iš anksto nustatytas specialias reikšmes. Šios reikšmės gali būti naudojamos vietoj laukų.
„Cron Expression“ naudojimas „Java“.
„Java“ teikia atvirojo kodo užduočių planavimo sistemą, kuri suplanuoja užduotį konkrečiam laiko vienetui. Galime atsisiųsti Quartz planerį iš oficialios svetainės.
Kalbant apie programavimą, darbas yra klasė, kurioje yra užduotis, kurią reikia atlikti. Tačiau kyla klausimas, kaip tai suplanuoti. Norėdami planuoti užduotį, apibrėžiame trigerį ir nurodome, kada užduotis bus vykdoma.
Jei norime įdiegti Quartz planuoklį, galime pridėti priklausomybę taip:
org.quartz-scheduler quartz 2.2.1
Pastaba: Prieš vykdydami šią Java programą įsitikinkite, kad ją įtraukėte kvarcas-2.2.1.stiklainis failą kelyje, kitaip gausite klaidą.
Pažiūrėkime, kaip įdiegta cron išraiška ir darbas per Java programą.
1 žingsnis: Sukurkite Maven projektą. Sukūrėme pavadinimu CronPavyzdys .
2 žingsnis: Projekto viduje sukurkite du paketus com.javatpoint.app ir com.javatpoint.job . Pirmajame pakete apibrėžsime pagrindinę klasę, o antrajame – darbus (mūsų atveju darbų skaičius yra penki).
3 veiksmas: Į pom.xml failą įklijuokite šią priklausomybę. Jis automatiškai atsisiunčia projektui reikalingus JAR failus. POM failas atrodo taip:
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
4 veiksmas: Sukurkite penkias užduotis (pakete com.javatpoint.job), kurias norite vykdyti. Mūsų atveju apibrėžėme šiuos penkis darbus.
ekta kapoor aktorius
Darbas1.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()); } }
Darbas2.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()); } }
Darbas3.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()); } }
Darbas4.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()); } }
Darbas5.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()); } }
5 veiksmas: Sukurkite pagrindinę klasę pavadinimu 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(); } } }
Kai atliksime visus aukščiau nurodytus veiksmus, projekto katalogas atrodo taip:
6 veiksmas: Paleiskite aukščiau pateiktą Java programą, kad pamatytumėte išvestį.
Stebime, kad kiekvienas darbas atliekamas tam tikru laiko intervalu.