Tehnoloģija nemitīgi mainās katru dienu. Dažreiz mums periodiski jāizpilda darbs serverī. Manuāla darba izpilde serverī ir sarežģīts uzdevums, tāpēc lietotājs vai administrators to nevar izdarīt vairākas reizes. Lai atrisinātu šo problēmu, Cron palīdz programmētājam periodiski izpildīt kādu darbu serverī. To plaši izmanto automatizētai sistēmu uzturēšanai un apbrīnošanai. Papildus tam mēs varam arī izmantot Krona izteiksme tīmekļa izstrādē. Pastāv daudzas situācijas, kad tīmekļa lietojumprogrammai periodiski jāizpilda noteikts uzdevums.
Šajā sadaļā mēs apspriedīsim Java Cron izteiksmes , tas darbojas un tiek īstenots Java Quartz plānotājs .
Kas ir Krons?
Būtībā Cron ir utilīta, kas ieplāno uzdevumu. Tas ļauj lietotājam ieplānot uzdevumu periodiski noteiktā laikā, datumā, mēnesī, vājā un gadā. To plaši izmanto automatizētos procesos, kur nav nepieciešama cilvēka iejaukšanās.
Krona izteiksme
Java, Cron izteiksmes tiek izmantotas, lai konfigurētu gadījumus CronTrigger klasē. Tā ir apakšklase org.quartz.Trigger klasē. Krona izteiksme ir virkne vai izteiksme, kas sastāv no sešiem vai septiņiem laukiem (laika vienība). Tajā ir aprakstītas atsevišķas grafika un komandas detaļas.
Krona izteiksme var būt gan vienkārša, gan sarežģīta. Piemēram,
Vienkārši: * * * * ? * (zvaigznīte apzīmē laukus)
Komplekss: 0 0/4 12,15,3-35,52 ? Maijs, jūnijs, jūlijs OT-SEST 2002-2010.
Ņemiet vērā arī to, ka Cron izteiksmi var rakstīt dažādos stilos, kā norādīts tālāk. Piemēram, trim Cron izteiksmēm ir tāda pati nozīme.
avl koks
- 0 10 9? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
Visas trīs izteiksmes tiek izpildītas katru dienu pulksten 9:10.
Krona izteiksmē izmantotie lauki
Krona izteiksmēs laika vienība ir pazīstama kā lauks . Tie ir atdalīti ar atstarpi, var saturēt jebkuru no atļautajām vērtībām ar dažādām šī lauka atļauto rakstzīmju kombinācijām. Tas parāda laukus paredzētajā secībā. Nākamajā tabulā ir attēlota laika vienība un atbilstošās vērtības, kā arī simboli, ko var izmantot ar izteiksmēm.
Lauka nosaukums | Obligāti | Atļautās vērtības | Atļautas īpašās rakstzīmes un simboli ar laukiem |
---|---|---|---|
Sekundes | Jā | 0-59 | , - * / |
Minūtes | Jā | 0-59 | , - * / |
Stundas | Jā | 0-23 | , - * / |
Mēneša diena | Jā | -31 | , - * ? / L W C |
Mēnesis | Jā | 0-11 vai JAN-DEC | , - * / |
Nedēļas diena | Jā | 1-7 vai SV-SET | , - * ? / L C # |
gads | Neobligāti | tukšs vai 1970.-2099 | , - * / |
Krona izteiksmē izmantotie īpašie simboli un burti
Zvaigznīte (*): Simbols tiek izmantots, ja mēs vēlamies izpildīt notikumu katrā laika vienībā (minūte, sekunde, stunda). Piemēram, ja * tiek lietots ar minūtes laika vienību, tas nozīmē, ka notikums tiks izpildīts katru minūti automātiski.
Jautājuma zīme (?): Simbols tiek izmantots tādos laukos kā mēneša diena un nedēļas diena. Tas apzīmē patvaļīgu vērtību un ignorē lauku vērtību. Pieņemsim, ka mēs vēlamies izpildīt skriptu katra mēneša 2. datumā, nerūpējoties par to, kura nedēļas diena iekrīt mēneša 2. datumā. Šajā gadījumā mums jānorāda jautājuma zīmes simbols ( ?) nedēļas dienas laukā.
Defise (-): Simbols tiek izmantots, lai norādītu diapazonu. Tas nosaka vērtību diapazonu. Piemēram, ja stundu lauks ir definēts kā , nozīmē, ka pasākums tiks izpildīts 4. un 5. stundā.
Komats (,): To izmanto, lai definētu ar komatu atdalīto lauku vērtības. Piemēram, piektdien, sestdien, svētdien utt.
Uz priekšu slīpsvītra (/): To izmanto, lai palielinātu norādītās laika vienības vērtības. Pieņemsim, ka mēs vēlamies sākt notikumu pēc 10 minūtēm, pēc tam mums ir jāizpilda tas pats notikums pēc 20 minūtēm, nākamā izpilde pēc 30 minūtēm un tā tālāk. Šajā gadījumā mēs norādām sākuma laiku un pieauguma vērtību, atdalot tos ar slīpsvītru.
Piemēram, ja 10/10 Minūtes laukā norādītajā laukā tas nozīmē, ka pirmais notikums tiks izpildīts pēc 10 minūtēm, bet nākamā izpilde notiks pēc 20 minūtēm pēc stundas, un tātad nē.
L (pēdējais): L lietojumam dažādās jomās ir atšķirīga nozīme.
- Ja tas ir izmantots lauks, tas apzīmē mēneša pēdējo dienu saskaņā ar kalendāru.
- Ja tas ir izmantots ar nobīdes vērtību, piemēram, L-5 . Tas apzīmē 5thlīdz kalendārā mēneša pēdējai dienai.
- Ja tas ir izmantots lauks, tas apzīmē nedēļas pēdējo dienu. To var izmantot arī ar citām vērtībām laukā. Piemēram, 7L apzīmē pagājušajā sestdienā .
IN: Vēlākais apzīmē darba dienas (no pirmdienas līdz piektdienai). Tas nosaka nedēļas dienu, kas ir vistuvāk norādītajai mēneša dienai.
Piemēram, ja mēs norādām 5W Mēneša dienas laukā tas nozīmē w nosaka nedēļas dienu tuvu 5thmēneša.
- Ja 5thmēneša ir sestdiena , tiks aktivizēts notikums 9th mēneša.
- Ja 5thmēneša ir svētdiena , tiks aktivizēts notikums vienpadsmitth mēneša.
Var būt arī cits gadījums. Pieņemsim , 1stmēneša ir sestdiena, pasākums notiks 3rdmēneša. Tas nozīmē, ka notikums vai skripts netiks izpildīts iepriekšējā mēnesī.
Hash (#): Tas ir n-tā mēneša nedēļas dienas reize. Piemēram, mēneša trešo piektdienu var norādīt kā 6#3 .
Kāpēc mums vajadzētu izmantot cron izteiksmes?
Cron izteiksmju izmantošanai ir dažādi iemesli. Daži no tiem ir:
- Mēs varam dzēst kešatmiņā saglabātos datu failus ar noteiktu intervālu.
- Mēs varam ieplānot ikdienas ziņu vēstules un e-pastus.
- Mēs varam ieplānot ilgstošus uzdevumus palaist no komandrindas skripta, nevis palaist to no tīmekļa skripta. Piemēram, video kodēšana vai lielapjoma e-pasta sūtīšana.
Krona izteiksmju piemērs
Apskatīsim dažas izplatītas Cron izteiksmes, kas izmanto īpašus simbolus un laukus.
Krona izteiksme | Krona izteiksmju nozīme |
---|---|
0 12 * * ? | Tas norāda, ka darbs tiks izpildīts katru dienu pulksten 12:00 (pusdienlaikā). |
0/5 13.18 * * ? | Tas norāda, ka darbs tiks izpildīts ik pēc piecām minūtēm, sākot no plkst. 13:00 un beidzas plkst. 13:55 un pēc tam sākas plkst. 18:00 un beidzas plkst. 18:55 katru dienu. |
0-5 13 * * ? | Tas norāda, ka darbs tiks izpildīts katru minūti, sākot no plkst. 13:00 līdz plkst. 13:05, katru dienu. |
15,45 13 ? 6 otr | Tas norāda, ka darbs tiks izpildīts pulksten 13:15 un 13:45 katru jūnija otrdienu. |
30 9? * PRM-PIKT | Tas norāda, ka darbs tiks izpildīts pulksten 9:30 katru pirmdienu, otrdienu, trešdienu, ceturtdienu un piektdienu. |
30 9 15 * ? | Tas norāda, ka darbs tiks izpildīts pulksten 9:30 katra mēneša 15. dienā. |
0 18 L * ? | Tas norāda, ka darbs tiks izpildīts pulksten 18:00 katra mēneša pēdējā dienā. |
0 18 L-3 * ? | Tas norāda, ka darbs tiks izpildīts pulksten 18:00 katra mēneša trešajā līdz pēdējai dienai. |
30 10? *5L | Tas norāda, ka darbs tiks izpildīts pulksten 10:30 katra mēneša pēdējā ceturtdienā. |
0 10? * 23 | Tas norāda, ka darbs tiks izpildīts pulksten 10:00 katra mēneša trešajā pirmdienā. |
0 0 10/5 * ? | Tas nozīmē, ka darbs tiks izpildīts katru dienu pulksten 12 pusnaktī piecas dienas, sākot no mēneša 10. datuma. |
0 11 11 11 11 ? | Tas norāda, ka darbs tiks izpildīts katru 11. novembri plkst. 11:11 |
0 15 10? * 6L 2002-2005 | Ugunsgrēks pulksten 10:15 katra mēneša pēdējā piektdienā 2002., 2003., 2004. un 2005. gadā. |
0 0 0? * MANS #1 | Tas norāda, ka darbs tiks izpildīts mēneša pirmajā pirmdienā pusnaktī. |
0 0 0 LW * * | Tas norāda, ka darbs tiks izpildīts mēneša pēdējā darba dienā pusnaktī. |
0 0/30 8-10 * * * | Tas norāda, ka darbs tiks izpildīts katru dienu pulksten 8:00, 8:30, 9:00, 9:30, 10:00 un 10:30. |
Īpašs iestatījums Cron izteiksmēs
Papildus iepriekš minētajam īpašajam simbolam Cron izteiksme atbalsta arī dažas iepriekš definētas īpašas vērtības. Šīs vērtības var izmantot lauku vietā.
Cron Expression izmantošana Java
Java nodrošina atvērtā koda darbu plānošanas sistēmu, kas ieplāno darbu noteiktai laika vienībai. Mēs varam lejupielādēt Quartz plānotāju no oficiālās vietnes.
saira banu aktieris
Programmēšanas ziņā darbs ir klase, kas satur izpildāmo uzdevumu. Bet jautājums ir, kā to ieplānot. Lai ieplānotu darbu, mēs definējam trigeri un norādām, kad darbs tiks izpildīts.
Ja vēlamies ieviest Quartz plānotāju, mēs varam pievienot atkarību šādi:
org.quartz-scheduler quartz 2.2.1
Piezīme. Pirms šīs Java programmas izpildes pārliecinieties, vai esat pievienojis kvarca-2.2.1.burka failu ceļā, pretējā gadījumā tiks parādīta kļūda.
Apskatīsim cron izteiksmes un darba ieviešanu, izmantojot Java programmu.
1. darbība: Izveidojiet Maven projektu. Mēs esam izveidojuši ar nosaukumu CronPiemērs .
2. darbība: Projektā izveidojiet divas paketes com.javatpoint.app un com.javatpoint.job . Pirmajā paketē mēs definēsim galveno klasi, bet otrajā - darba vietas (mūsu gadījumā darbu skaits ir pieci).
10 ar pakāpi 6
3. darbība: Failā pom.xml ielīmējiet šādu atkarību. Tas automātiski lejupielādē projektam nepieciešamos JAR failus. Pom fails izskatās šādi:
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
4. darbība: Izveidojiet piecus darbus (pakotnē com.javatpoint.job), kurus vēlaties izpildīt. Mūsu gadījumā mēs esam definējuši šādas piecas darbavietas.
Darbs1.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()); } }
Darbs2.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()); } }
Darbs3.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()); } }
Darbs4.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()); } }
Darbs5.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. darbība: Izveidojiet galveno klasi ar nosaukumu 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(); } } }
Kad esam paveikuši visas iepriekš minētās darbības, projekta direktorijs izskatās šādi:
6. darbība: Palaidiet iepriekš minēto Java programmu, lai redzētu izvadi.
Mēs novērojam, ka katrs darbs tiek izpildīts noteiktā laika intervālā.