מדריך למתזמן המשימות האביבי
1. סקירה כללית
במאמר זה נדון ב מנגנוני תזמון משימות האביב – מתזמן משימות וזה יישומים שנבנו מראש יחד עם הטריגרים השונים לשימוש. אם אתה רוצה לקרוא עוד על תזמון באביב, בדוק @ Async ו מתוזמן מאמרים.
TaskScheuler הוצג באביב 3.0 עם מגוון שיטות להפעלה בשלב כלשהו בעתיד, והוא גם מחזיר אובייקט ייצוג של ScheduledFuture ממשק, אשר יכול לשמש לביטול משימה מתוזמנת או לבדוק אם היא נעשתה או לא.
כל שעלינו לעשות הוא לבחור משימה הניתנת להפעלה לתזמון ואז לבחור במדיניות תזמון נכונה.
2. ThreadPoolTaskScheduler
ThreadPoolTaskScheduler מתאים היטב לניהול פתילים פנימי, מכיוון שהוא מאציל משימות ל ScheduledExecutorService ומיישם את TaskExecutor ממשק - כך שמופע יחיד שלו יוכל להתמודד עם ביצועים פוטנציאליים אסינכרוניים כמו גם על מתוזמן ביאור.
בואו נגדיר כעת ThreadPoolTaskScheduler שעועית בשעה ThreadPoolTaskSchedulerConfig: השעועית המוגדרת threadPoolTaskScheduler יכול לבצע משימות בצורה אסינכרונית בהתבסס על גודל הבריכה המוגדר של 5. שים לב שכולם ThreadPoolTaskScheduler לפני קידומת שמות פתילים קשורים ThreadPoolTaskScheduler. בואו נבצע משימה פשוטה שנוכל לתזמן: כעת אנו יכולים לתזמן פשוט את המשימה שתבוצע על ידי המתזמן: ה מתזמן משימות יתזמן משימה ניתנת להפעלה בתאריך ידוע, בדיוק 3 שניות לאחר השעה הנוכחית. בואו נעבור קצת יותר לעומק עם ה- ThreadPoolTaskScheduler מנגנוני תזמון. תזמון עם עיכוב קבוע יכול להיעשות בשני מנגנונים פשוטים: בואו להגדיר משימה שתופעל לאחר עיכוב קבוע של 1000 אלפיות השנייה: ה RunnableTask תמיד יעבור 1000 אלפיות שניות מאוחר יותר בין השלמת ביצוע אחת לתחילת הפעולה הבאה. בואו להגדיר משימה שתופעל לאחר עיכוב קבוע של זמן התחלה נתון: ה RunnableTask יופעל בזמן הביצוע שצוין שבעיקר הזמן בו @PostConstruct השיטה מתחילה ובהמשך עם עיכוב של 1000 אלפיות השנייה. ישנם שני מנגנונים פשוטים לתזמון משימות הפעלה בקצב קבוע: בואו נקבע משימה לרוץ ב- שיעור קבוע של אלפיות השנייה: הבא RunnableTask יפעל תמיד לאחר 2000 אלפיות השנייה, לא משנה מצב הביצוע האחרון שעשוי להיות פועל. ה RunnableTask יפעל 3000 אלפיות השנייה לאחר הזמן הנוכחי. CronTrigger משמש לתזמון משימה על בסיס ביטוי cron: ניתן להשתמש בטריגר שסופק להפעלת משימה על פי קצב או לוח זמנים מסוים: במקרה זה, RunnableTask יבוצע בשנייה העשירית של כל דקה. בואו נשתמש PeriodicTrigger לתזמון משימה עם עיכוב קבוע של 2000 אלפיות השנייה: מוגדר PeriodicTrigger שעועית תשמש להפעלת משימה לאחר עיכוב קבוע של 2000 אלפיות השנייה. עכשיו בואו נקבע את ה- RunnableTask עם ה PeriodicTrigger: אנחנו גם יכולים להגדיר PeriodicTrigger כדי לאתחל בקצב קבוע ולא בעיכוב קבוע, אנו גם יכולים להגדיר עיכוב ראשוני למשימה המתוזמנת הראשונה באלפיות שניות. כל שעלינו לעשות הוא להוסיף שתי שורות קוד לפני הצהרת ההחזרה ב- periodicTrigger אפונה: השתמשנו ב- setFixedRate שיטה לתזמון המשימה בקצב קבוע ולא בעיכוב קבוע, ואז setInitialDelay השיטה משמשת לקביעת עיכוב ראשוני רק עבור המשימה הראשונה שניתנת להפעלה. במאמר מהיר זה, המחישנו כיצד לתזמן משימה ניתנת להפעלה באמצעות תמיכת האביב למשימות. הסתכלנו על הפעלת המשימה בעיכוב קבוע, בקצב קבוע ולפי טריגר שצוין. וכמו תמיד, הקוד זמין כפרויקט Maven ב- GitHub.@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; }}
class RunnableTask מיישם Runnable {private String message; RunnableTask (הודעת מחרוזת) ציבורית {this.message = הודעה; } @ עקוף הפעלה בטלנית ציבורית () {System.out.println (תאריך חדש () + "משימה ניתנת לריצה עם" + הודעה + "בשרשור" + Thread.currentThread (). GetName ()); }}
taskScheduler.schedule (Runnabletask חדש ("זמן ספציפי, 3 שניות מעכשיו"), תאריך חדש (System.currentTimeMillis + 3000));
3. קבע משימה ריצה עם עיכוב קבוע
3.1. תזמון לאחר עיכוב קבוע בביצוע המתוכנן האחרון
taskScheduler.scheduleWithFixedDelay (חדש RunnableTask ("עיכוב שנייה קבוע"), 1000);
3.2. תזמון לאחר עיכוב קבוע של תאריך ספציפי
taskScheduler.scheduleWithFixedDelay (RunnableTask חדש ("תאריך נוכחי קבוע עיכוב שנייה 1)), תאריך חדש (), 1000);
4. תזמון בשיעור קבוע
4.1. תזמון ה- RunnableTask בתעריף קבוע
taskScheduler.scheduleAtFixedRate (חדש RunnableTask ("קצב קבוע של 2 שניות"), 2000);
4.2. תזמון ה- RunnableTask בתעריף קבוע מתאריך נתון
taskScheduler.scheduleAtFixedRate (RunnableTask חדש ("קצב קבוע של 2 שניות"), תאריך חדש (), 3000);
5. תזמון עם CronTrigger
CronTrigger cronTrigger = CronTrigger חדש ("10 * * * *?");
taskScheduler.schedule (חדש RunnableTask ("Cron Trigger"), cronTrigger);
6. תזמון עם PeriodicTrigger
PeriodicTrigger periodicTrigger = חדש PeriodicTrigger (2000, TimeUnit.MICROSECONDS);
taskScheduler.schedule (חדש RunnableTask ("טריגר תקופתי"), periodicTrigger);
periodicTrigger.setFixedRate (נכון); periodicTrigger.setInitialDelay (1000);
7. מסקנה