מדריך למתזמן המשימות האביבי

1. סקירה כללית

במאמר זה נדון ב מנגנוני תזמון משימות האביבמתזמן משימות וזה יישומים שנבנו מראש יחד עם הטריגרים השונים לשימוש. אם אתה רוצה לקרוא עוד על תזמון באביב, בדוק @ Async ו מתוזמן מאמרים.

TaskScheuler הוצג באביב 3.0 עם מגוון שיטות להפעלה בשלב כלשהו בעתיד, והוא גם מחזיר אובייקט ייצוג של ScheduledFuture ממשק, אשר יכול לשמש לביטול משימה מתוזמנת או לבדוק אם היא נעשתה או לא.

כל שעלינו לעשות הוא לבחור משימה הניתנת להפעלה לתזמון ואז לבחור במדיניות תזמון נכונה.

2. ThreadPoolTaskScheduler

ThreadPoolTaskScheduler מתאים היטב לניהול פתילים פנימי, מכיוון שהוא מאציל משימות ל ScheduledExecutorService ומיישם את TaskExecutor ממשק - כך שמופע יחיד שלו יוכל להתמודד עם ביצועים פוטנציאליים אסינכרוניים כמו גם על מתוזמן ביאור.

בואו נגדיר כעת ThreadPoolTaskScheduler שעועית בשעה ThreadPoolTaskSchedulerConfig:

@Configuration @ComponentScan (basePackages = "com.baeldung.taskscheduler", basePackageClasses = {ThreadPoolTaskSchedulerExamples.class}) class public ThreadPoolTaskSchedulerConfig {@Bean Public ThreadPoolTaskScheduler threadPoolTaskSchedler_TaskSchedler_TaskSchedler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskSchedler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskScheduler_TaskSchedulerToolS- threadPoolTaskScheduler.setPoolSize (5); threadPoolTaskScheduler.setThreadNamePrefix ("ThreadPoolTaskScheduler"); חזור threadPoolTaskScheduler; }}

השעועית המוגדרת threadPoolTaskScheduler יכול לבצע משימות בצורה אסינכרונית בהתבסס על גודל הבריכה המוגדר של 5.

שים לב שכולם ThreadPoolTaskScheduler לפני קידומת שמות פתילים קשורים ThreadPoolTaskScheduler.

בואו נבצע משימה פשוטה שנוכל לתזמן:

class RunnableTask מיישם Runnable {private String message; RunnableTask (הודעת מחרוזת) ציבורית {this.message = הודעה; } @ עקוף הפעלה בטלנית ציבורית () {System.out.println (תאריך חדש () + "משימה ניתנת לריצה עם" + הודעה + "בשרשור" + Thread.currentThread (). GetName ()); }} 

כעת אנו יכולים לתזמן פשוט את המשימה שתבוצע על ידי המתזמן:

taskScheduler.schedule (Runnabletask חדש ("זמן ספציפי, 3 שניות מעכשיו"), תאריך חדש (System.currentTimeMillis + 3000)); 

ה מתזמן משימות יתזמן משימה ניתנת להפעלה בתאריך ידוע, בדיוק 3 שניות לאחר השעה הנוכחית.

בואו נעבור קצת יותר לעומק עם ה- ThreadPoolTaskScheduler מנגנוני תזמון.

3. קבע משימה ריצה עם עיכוב קבוע

תזמון עם עיכוב קבוע יכול להיעשות בשני מנגנונים פשוטים:

3.1. תזמון לאחר עיכוב קבוע בביצוע המתוכנן האחרון

בואו להגדיר משימה שתופעל לאחר עיכוב קבוע של 1000 אלפיות השנייה:

taskScheduler.scheduleWithFixedDelay (חדש RunnableTask ("עיכוב שנייה קבוע"), 1000);

ה RunnableTask תמיד יעבור 1000 אלפיות שניות מאוחר יותר בין השלמת ביצוע אחת לתחילת הפעולה הבאה.

3.2. תזמון לאחר עיכוב קבוע של תאריך ספציפי

בואו להגדיר משימה שתופעל לאחר עיכוב קבוע של זמן התחלה נתון:

taskScheduler.scheduleWithFixedDelay (RunnableTask חדש ("תאריך נוכחי קבוע עיכוב שנייה 1)), תאריך חדש (), 1000);

ה RunnableTask יופעל בזמן הביצוע שצוין שבעיקר הזמן בו @PostConstruct השיטה מתחילה ובהמשך עם עיכוב של 1000 אלפיות השנייה.

4. תזמון בשיעור קבוע

ישנם שני מנגנונים פשוטים לתזמון משימות הפעלה בקצב קבוע:

4.1. תזמון ה- RunnableTask בתעריף קבוע

בואו נקבע משימה לרוץ ב- שיעור קבוע של אלפיות השנייה:

taskScheduler.scheduleAtFixedRate (חדש RunnableTask ("קצב קבוע של 2 שניות"), 2000);

הבא RunnableTask יפעל תמיד לאחר 2000 אלפיות השנייה, לא משנה מצב הביצוע האחרון שעשוי להיות פועל.

4.2. תזמון ה- RunnableTask בתעריף קבוע מתאריך נתון

taskScheduler.scheduleAtFixedRate (RunnableTask חדש ("קצב קבוע של 2 שניות"), תאריך חדש (), 3000);

ה RunnableTask יפעל 3000 אלפיות השנייה לאחר הזמן הנוכחי.

5. תזמון עם CronTrigger

CronTrigger משמש לתזמון משימה על בסיס ביטוי cron:

CronTrigger cronTrigger = CronTrigger חדש ("10 * * * *?"); 

ניתן להשתמש בטריגר שסופק להפעלת משימה על פי קצב או לוח זמנים מסוים:

taskScheduler.schedule (חדש RunnableTask ("Cron Trigger"), cronTrigger);

במקרה זה, RunnableTask יבוצע בשנייה העשירית של כל דקה.

6. תזמון עם PeriodicTrigger

בואו נשתמש PeriodicTrigger לתזמון משימה עם עיכוב קבוע של 2000 אלפיות השנייה:

PeriodicTrigger periodicTrigger = חדש PeriodicTrigger (2000, TimeUnit.MICROSECONDS);

מוגדר PeriodicTrigger שעועית תשמש להפעלת משימה לאחר עיכוב קבוע של 2000 אלפיות השנייה.

עכשיו בואו נקבע את ה- RunnableTask עם ה PeriodicTrigger:

taskScheduler.schedule (חדש RunnableTask ("טריגר תקופתי"), periodicTrigger);

אנחנו גם יכולים להגדיר PeriodicTrigger כדי לאתחל בקצב קבוע ולא בעיכוב קבוע, אנו גם יכולים להגדיר עיכוב ראשוני למשימה המתוזמנת הראשונה באלפיות שניות.

כל שעלינו לעשות הוא להוסיף שתי שורות קוד לפני הצהרת ההחזרה ב- periodicTrigger אפונה:

periodicTrigger.setFixedRate (נכון); periodicTrigger.setInitialDelay (1000);

השתמשנו ב- setFixedRate שיטה לתזמון המשימה בקצב קבוע ולא בעיכוב קבוע, ואז setInitialDelay השיטה משמשת לקביעת עיכוב ראשוני רק עבור המשימה הראשונה שניתנת להפעלה.

7. מסקנה

במאמר מהיר זה, המחישנו כיצד לתזמן משימה ניתנת להפעלה באמצעות תמיכת האביב למשימות.

הסתכלנו על הפעלת המשימה בעיכוב קבוע, בקצב קבוע ולפי טריגר שצוין.

וכמו תמיד, הקוד זמין כפרויקט Maven ב- GitHub.