הטכנולוגיה משתנה כל הזמן מיום ליום. לעיתים, אנו נדרשים לבצע עבודה מעת לעת בשרת. הפעלת העבודה על השרת באופן ידני היא משימה קשה ולכן לא ניתן לבצע אותה מספר פעמים על ידי המשתמש או המנהל. על מנת לפתור בעיה זו, קרון עוזר למתכנת לבצע עבודה מעת לעת בשרת. הוא נמצא בשימוש נרחב לתחזוקת מערכת אוטומטית ולהערצה. חוץ מזה, אנחנו יכולים גם להשתמש הבעת קרון בפיתוח אתרים. ישנם מצבים רבים שבהם ייתכן שיישום אינטרנט יצטרך לבצע משימה מסוימת מעת לעת.
בחלק זה, נדון ב ביטויי Java Cron , זה עובד ויישום דרך מתזמן Java Quartz .
מה זה קרון?
בעיקרון, Cron הוא כלי עזר שמתזמן משימה. זה מאפשר למשתמש לתזמן משימה מעת לעת בזמן, תאריך, חודש, חלש ושנה מוגדרים. זה נמצא בשימוש נרחב בתהליך אוטומטי שבו התערבות אנושית אינה נדרשת.
ביטוי קרון
ב-Java, ביטויי Cron משמשים להגדרת מופעים של CronTrigger מעמד. זה תת-מעמד של org.quartz.trigger מעמד. ביטוי Cron הוא מחרוזת או ביטוי המורכבים משישה או שבעה שדות (יחידת זמן). הוא מתאר פרטים בודדים של לוח הזמנים והפקודה.
ביטוי קרון עשוי להיות פשוט כמו גם מורכב. לדוגמה,
פָּשׁוּט: * * * * ? * (כוכבית מציינת שדות)
מורכב: 0 0/4 12,15,3-35,52 ? מאי, יוני, יולי שלישי-שבת 2002-2010.
כמו כן, שימו לב שניתן לכתוב ביטוי Cron בסגנונות שונים, כדלקמן. לדוגמה, לביטוי שלושת Cron הבא יש את אותה משמעות.
- 0 10 9 ? * *
- 0 10 9 * * ?
- 0 10 9 * * ? *
כל שלושת הביטויים, מבוצעים בשעה 9:10 בבוקר כל יום.
שדות המשמשים בביטוי Cron
בביטויי Cron, יחידת זמן ידועה בשם שדה . אלה מופרדים על ידי רווח לבן, יכולים להכיל כל אחד מהערכים המותרים עם שילובים שונים של התווים המותרים עבור אותו שדה. זה מציג את השדות בסדר הצפוי. הטבלה הבאה מתארת את יחידת הזמן והערכים התואמים, וסמלים שניתן להשתמש בהם עם הביטויים.
שם שדה | נדרש | ערכים מותרים | מותר תווים מיוחדים וסמלים עם שדות |
---|---|---|---|
שניות | כן | 0-59 | , - * / |
דקות | כן | 0-59 | , - * / |
שעה (ות | כן | 0-23 | , - * / |
יום בחודש | כן | -31 | , - * ? / L W C |
חוֹדֶשׁ | כן | 0-11 או ינואר-דצמבר | , - * / |
יום בשבוע | כן | 1-7 או ראשון-שבת | , - * ? / L C # |
שָׁנָה | אופציונאלי | ריק או 1970-2099 | , - * / |
סמלים ואותיות מיוחדים המשמשים בביטוי קרון
כוכבית (*): הסמל משמש כאשר אנו רוצים לבצע אירוע בכל יחידת זמן (דקה, שנייה, שעה). לדוגמה, אם נעשה שימוש ב-* עם יחידת זמן דקות, זה אומר שאירוע יתבצע בכל דקה, באופן אוטומטי.
סימן שאלה (?): הסמל משמש בשדות כמו יום בחודש ויום בשבוע. זה מציין את הערך השרירותי ומתעלם מערך השדות. נניח שאנו רוצים להפעיל סקריפט ב-2 בכל חודש מבלי שיהיה אכפת מאיזה יום בשבוע יחול ביום השני בחודש. במקרה זה, עלינו לציין סמל סימן שאלה ( ?) בשדה היום בשבוע.
מקף (-): הסמל משמש לציון הטווח. הוא קובע את טווח הערכים. לדוגמה, אם שדה שעה מוגדר כ , פירושו שאירוע יתקיים בשעה הרביעית והחמישית.
פסיק (,): הוא משמש להגדרת ערכים של השדות המופרדים בפסיק. לדוגמה, שישי, שבת, ראשון וכו'.
קו נטוי (/): הוא משמש להגדלת ערכים של יחידת הזמן שצוינה. נניח שאנו רוצים להתחיל אירוע ב-10 דקות, לאחר מכן אנו נדרשים לבצע את אותו אירוע ב-20 דקות, את הביצוע הבא ב-30 דקות וכן הלאה. במקרה זה, אנו מציינים את שעת ההתחלה ואת הערך המצטבר, מופרדים באמצעות לוכסן קדימה.
לדוגמה, אם 10/10 בצוין בשדה הדקה, זה אומר ביצוע אירוע ראשון ב-10 דקות, והביצוע הבא יהיה ב-20 דקות של שעה, ולכן לא.
L (אחרון): לשימוש ב-L יש משמעות שונה בתחומים שונים.
- אם נעשה בו שימוש ב- שדה, הוא מציין את היום האחרון של החודש, לפי לוח השנה.
- אם נעשה בו שימוש עם ערך היסט כמו L-5 . זה מציין את ה-5ה'ליום האחרון של החודש הקלנדרי.
- אם נעשה בו שימוש ב- שדה, הוא מציין את היום האחרון בשבוע. ניתן להשתמש בו גם עם ערך אחר בתחום. לדוגמה, 7 ליטר מציין את שבת שעברה .
IN: המאוחר מייצג את ימי השבוע (שני עד שישי). הוא קובע את יום השבוע הקרוב ביותר ליום שצוין בחודש.
למשל, אם נפרט 5W בשדה יום החודש, פירוש הדבר הוא שקבע את יום השבוע הקרוב ל-5ה'של החודש.
- אם ה-5ה'של החודש הוא יום שבת , אירוע יופעל 9ה' של החודש.
- אם ה-5ה'של החודש הוא יוֹם רִאשׁוֹן , אירוע יופעל אחד עשרה' של החודש.
יכול להיות שיש מקרה אחר. לְהַנִיחַ , 1רחובהחודש הוא שבת, אירוע יתקיים ב-3מחקר ופיתוחשל החודש. זה אומר שאירוע או סקריפט לא יבוצעו בחודש הקודם.
Hash (#): הוא מייצג את המופע ה-n של יום חול בחודש. לדוגמה, ניתן לציין את יום שישי השלישי בחודש כ 6#3 .
עץ avl
מדוע עלינו להשתמש בביטויי cron?
ישנן סיבות שונות להשתמש בביטויי cron. חלק מהם הם:
- אנו יכולים לפוג ולמחוק קבצי נתונים שמורים במרווח מסוים.
- אנו יכולים לתזמן מכתבי חדשות ומיילים יומיים.
- אנו יכולים לתזמן משימות ארוכות ריצה להפעלה מסקריפט של שורת פקודה, במקום להפעיל אותו מסקריפט אינטרנט. כמו קידוד סרטונים, או שליחת הודעות דואר אלקטרוני בכמות גדולה.
דוגמה לביטויי קרון
בואו נראה כמה ביטויי Cron נפוצים המשתמשים בסמלים מיוחדים ובשדות.
ביטוי קרון | המשמעות של ביטויי קרון |
---|---|
0 12 * * ? | זה מציין שעבודה תתבצע בשעה 12:00 (בצהריים) בכל יום. |
0/5 13.18 * * ? | זה מציין שעבודה תתבצע בכל חמש דקות החל מהשעה 13:00 ותסתיים בשעה 13:55 ולאחר מכן החל בשעה 18:00 ויסתיים בשעה 18:55, בכל יום. |
0-5 13 * * ? | זה מציין שעבודה תתבצע בכל דקה החל מהשעה 13:00 ומסתיימת בשעה 13:05, בכל יום. |
15,45 13 ? 6 ג' | זה מציין שעבודה תתבצע בשעה 13:15 ו-13:45 בכל יום שלישי בחודש יוני. |
30 9? * שני עד שישי | זה מציין שעבודה תתבצע בשעה 9:30 בבוקר בכל שני, שלישי, רביעי, חמישי ושישי. |
30 9 15 * ? | זה מציין שעבודה תתבצע בשעה 9:30 בבוקר ביום ה-15 בכל חודש. |
0 18 ל' * ? | זה מציין שעבודה תתבצע בשעה 18:00 ביום האחרון של כל חודש. |
0 18 L-3 * ? | זה מציין שעבודה תתבצע בשעה 18:00 ביום השלישי עד האחרון של כל חודש. |
30 10 ? *5 ליטר | זה מציין שעבודה תתבצע בשעה 10:30 ביום חמישי האחרון של כל חודש. |
0 10 ? * 23 | זה מציין שעבודה תתבצע בשעה 10 בבוקר ביום שני השלישי בכל חודש. |
0 0 10/5 * ? | זה מציין שעבודה תתבצע בשעה 12 בחצות בכל יום במשך חמישה ימים החל מהיום העשירי בחודש. |
0 11 11 11 11 ? | זה מציין שעבודה תתבצע בכל 11 בנובמבר בשעה 11:11 |
0 15 10 ? * 6L 2002-2005 | ירי בשעה 10:15 בכל יום שישי האחרון של כל חודש במהלך השנים 2002, 2003, 2004 ו-2005. |
0 0 0 ? * שלי מס' 1 | זה מציין שעבודה תתבצע ביום שני הראשון בחודש בחצות. |
0 0 0 LW * * | זה מציין שעבודה תתבצע ביום חול האחרון של החודש בחצות. |
0 0/30 8-10 * * * | זה מציין שעבודה תתבצע בשעה 8:00, 8:30, 9:00, 9:30, 10:00 ו-10:30 בכל יום. |
הגדרה מיוחדת ב-Cron Expressions
מלבד הסמל המיוחד לעיל, ביטוי Cron תומך גם בכמה ערכים מיוחדים מוגדרים מראש. ניתן להשתמש בערכים אלו במקום בשדות.
שימוש ב-Cron Expression ב-Java
Java מספקת מערכת תזמון משרות בקוד פתוח שמתזמנת עבודה ליחידת זמן מסוימת. אנחנו יכולים להוריד את מתזמן Quartz מהאתר הרשמי.
מבחינת תכנות, job היא מחלקה המכילה את המשימה שיש לבצע. אבל השאלה היא איך לתזמן את זה. עבור תזמון עבודה, אנו מגדירים טריגר ומציינים מתי העבודה תתבצע.
אם ברצוננו ליישם את מתזמן Quartz, נוכל להוסיף את התלות, באופן הבא:
org.quartz-scheduler quartz 2.2.1
הערה: לפני הפעלת תוכנית Java הבאה, ודא שהוספת קוורץ-2.2.1.צנצנת קובץ בנתיב, אחרת תקבל שגיאה.
בואו נראה את היישום של ביטוי cron ועבודה דרך תוכנית Java.
שלב 1: צור פרויקט של מייבן. יצרנו עם השם CronExample .
שלב 2: בתוך הפרויקט, צור שתי חבילות כלומר com.javatpoint.app ו com.javatpoint.job . בחבילה הראשונה נגדיר את המחלקה הראשית ובחבילה השנייה נגדיר את המשרות (במקרה שלנו מספר המשרות הוא חמש).
שלב 3: בקובץ pom.xml, הדבק את התלות הבאה. זה מוריד אוטומטית את קבצי ה-JAR הנדרשים עבור הפרויקט. קובץ הפום נראה כך:
4.0.0 com.javacodegeeks.snippets.enterprise quartzexample 0.0.1-SNAPSHOT org.quartz-scheduler quartz 2.2.1
שלב 4: צור חמש משימות (בחבילת com.javatpoint.job) שברצונך לבצע. בענייננו, הגדרנו את חמשת המשרות הבאות.
סימן מים במילה
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()); } }
שלב 5: צור את המחלקה הראשית עם השם 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(); } } }
כשסיימנו עם כל השלבים לעיל, ספריית הפרויקט נראית כך:
שלב 6: הפעל את תוכנית Java לעיל כדי לראות את הפלט.
אנו רואים שכל עבודה מבוצעת במרווח זמן מסוים.