תזמון באביב עם קוורץ

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

במדריך זה נבנה פשוט מתזמן באביב עם קוורץ.

נתחיל עם מטרה פשוטה בראש - להגדיר בקלות עבודה מתוזמנת חדשה.

1.1. רכיבי מפתח של ממשק ה- API של קוורץ

לקוורץ יש אדריכלות מודולרית. הוא מורכב ממספר רכיבים בסיסיים שניתן לשלב כנדרש. במדריך זה נתמקד באלה המשותפים לכל עבודה: עבודה, JobDetail, הדק ומתזמן.

למרות שנשתמש באביב לניהול היישום, כל רכיב נפרד יכול להיות מוגדר בשתי דרכים: קְוָרץ דרך או אביב דרך (באמצעות שיעורי הנוחות שלה).

אנו נכסה את שניהם ככל האפשר למען השלמות, אך ניתן לאמץ את שניהם. נתחיל לבנות, רכיב אחד בכל פעם.

2. עבודה ו JobDetail

2.1. עבודה

ה- API מספק א עבודה ממשק בעל שיטה אחת בלבד - לבצע. זה חייב להיות מיושם על ידי הכיתה שמכילה את העבודה בפועל שיש לבצע, כלומר את המשימה. כאשר ההדק של המשרה נורה, מתזמן המזמין את לבצע שיטה, להעביר אותה א JobExecutionContext לְהִתְנַגֵד.

ה JobExecutionContext מספק למופע העבודה מידע על סביבת זמן הריצה שלו, כולל ידית למתזמן, ידית למפעיל, ושל המשימה JobDetail לְהִתְנַגֵד.

בדוגמה מהירה זו - התפקיד מאציל את המשימה למחלקת שירות:

@Component בכיתה ציבורית SampleJob מיישמת את העבודה {@SampleJobService jobService הפרטית האוטומטית; לבצע חלל ציבורי (הקשר JobExecutionContext) זורק JobExecutionException {jobService.executeSampleJob (); }} 

2.2. JobDetail

התפקיד הוא אמנם סוס העבודה, אך קוורץ אינו מאחסן מופע ממשי של מעמד העבודה. במקום זאת, אנו יכולים להגדיר מופע של ה- עבודה משתמש ב JobDetail מעמד. יש לספק את הכיתה לתפקיד JobDetail כדי שיידע את סוּג של התפקיד שיש לבצע.

2.3. קְוָרץ JobBuilder

קוורץ JobBuilder מספק ממשק API לבנייה לבנייה JobDetail ישויות.

@Bean JobDetail הציבורי jobDetail () {החזר JobBuilder.newJob (). OfType (SampleJob.class) .storeDurably () .withIdentity ("Qrtz_Job_Detail") .withDescription ("הפעל שירות עבודה לדוגמא ..."). }

2.4. אביב JobDetailFactoryBean

האביב JobDetailFactoryBean מספק שימוש בסגנון שעועית לתצורה JobDetail מקרים. הוא משתמש בשם שעועית האביב כשם התפקיד, אם לא צוין אחרת:

@Bean JobDetailFactory הציבור שעועית JobDetail () {JobDetailFactoryBean jobDetailFactory = JobDetailFactoryBean חדש (); jobDetailFactory.setJobClass (SampleJob.class); jobDetailFactory.setDescription ("הפעל שירות עבודה לדוגמא ..."); jobDetailFactory.setDurability (true); להחזיר את העבודהDetailFactory; }

מופע חדש של JobDetail נוצר לכל ביצוע העבודה. ה JobDetail האובייקט מעביר את המאפיינים המפורטים של העבודה. לאחר סיום הביצוע, ההפניות למופע נושרות.

3. טריגר

א הדק הוא המנגנון לתזמון א עבודהכלומר א הדק למשל "מפטר" את ביצוע העבודה. יש הפרדה ברורה של אחריות בין עבודה (מושג מטלה) ו הדק (מנגנון תזמון).

בנוסף ל עבודה, הטריגר צריך גם a סוּג שניתן לבחור על פי דרישות התזמון.

נניח, אנחנו רוצים לתזמן את המשימה שלנו לביצוע פעם בשעה, ללא הגבלת זמן - אנחנו יכולים להשתמש בקוורץ TriggerBuilder או של אביב SimpleTriggerFactoryBean לעשות זאת.

3.1. קְוָרץ TriggerBuilder

TriggerBuilder הוא ממשק API בסגנון בנאי לבניית ה- הדק יֵשׁוּת:

מפעיל טריגר ציבורי @Bean (JobDetail job) {return TriggerBuilder.newTrigger (). ForJob (job) .withIdentity ("Qrtz_Trigger") .withDescription ("trigger trigger") .withSchedule (simpleSchedule (). RepeatForever (). WithIntervalInHours )) .בניין (); }

3.2. אביב SimpleTriggerFactoryBean

SimpleTriggerFactoryBean מספק שימוש בסגנון שעועית לתצורה SimpleTrigger. הוא משתמש בשם שעועית האביב כשם ההדק ומוגדר כברירת מחדל לחזרה בלתי מוגבלת, אם לא צוין אחרת:

@Bean הדק SimpleTriggerFactoryBean (משרה JobDetail) {הדק SimpleTriggerFactoryBean = SimpleTriggerFactoryBean חדש (); trigger.setJobDetail (עבודה); trigger.setRepeatInterval (3600000); trigger.setRepeatCount (SimpleTrigger.REPEAT_INDEFINITELY); הדק החזרת; }

4. קביעת התצורה של ג'ובסטור

ג'ובסטור מספק את מנגנון האחסון עבור ה- עבודה ו הדק, ואחראי על שמירת כל הנתונים הרלוונטיים למתזמן העבודה. ה- API תומך בשניהם לזכר ו מַתְמִיד חנויות.

4.1. לזכר ג'ובסטור

לדוגמא, נשתמש בזיכרון RAMJobStore המציע ביצועים מהירים במהירות ותצורה פשוטה באמצעות קוורץ. נכסים:

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

החיסרון הברור של RAMJobStore זה שכן נָדִיף בטבע. כל מידע על התזמון אבד בין כיבוי. אם יש לשמור על הגדרות התפקיד ולוחות הזמנים בין כיבוי, ההמשך JDBCJobStore חייבים להשתמש במקום.

כדי לאפשר זיכרון ג'ובסטור באביב, הגדרנו נכס זה שלנו application.properties:

spring.quartz.job-store-type = זיכרון

4.2. JDBC ג'ובסטור

ישנם שני סוגים של JDBCJobStore: JobStoreTX ו JobStoreCMT. שניהם מבצעים את אותה העבודה באחסון מידע על תזמון במסד נתונים.

ההבדל בין השניים הוא כיצד הם מנהלים את העסקאות המחייבות את הנתונים. ה JobStoreCMT סוג דורש עסקת יישום כדי לאחסן נתונים, ואילו ה- JobStoreTX סוג מתחיל ומנהל עסקאות משלו.

יש להגדיר מספר מאפיינים עבור JDBCJobStore. לכל הפחות, עלינו לציין את סוג ה- JDBCJobStore, מקור הנתונים ומחלקת מנהל ההתקן של מסד הנתונים. ישנן שיעורי נהג עבור מרבית מסדי הנתונים, אך StdJDBCDelegate מכסה את רוב המקרים:

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.dataSource = quartzDataSource

הגדרת JDBC ג'ובסטור באביב לוקח כמה צעדים. ראשית, הגדרנו את סוג החנות שלנו application.properties:

spring.quartz.job-store-type = jdbc

בשלב הבא עלינו לאפשר תצורה אוטומטית ולתת ל- Spring את מקור הנתונים הדרוש למתזמן קוורץ. ה @QuartzDataSource ההערה עושה את העבודה הקשה בהגדרת התצורה והאתחול של מאגר המידע עבורנו:

@Configuration @EnableAutoConfiguration מחלקה ציבורית SpringQrtzScheduler {@Bean @QuartzDataSource ציבורית DataSource quartzDataSource () {להחזיר DataSourceBuilder.create (). Build (); }}

5. מתזמן

ה מתזמן ממשק הוא ה- API הראשי להתממשקות עם מתזמן העבודה.

א מתזמן ניתן לאינסטנטציה עם SchedulerFactory. לאחר שנוצר, עבודהs ו- הדקניתן לרשום איתו. בתחילה, ה- מתזמן נמצא במצב "המתנה", וזה הַתחָלָה יש להפעיל את השיטה כדי להתחיל את האשכולות שמפעילים את ביצוע העבודות.

5.1. קְוָרץ StdSchedulerFactory

פשוט על ידי הפעלת ה- getScheduler שיטה על StdSchedulerFactory, אנחנו יכולים להסדיר את מתזמן, אתחל אותו (עם התצורה המוגדרת ג'ובסטור ו ThreadPool), והחזיר ידית ל- API שלו:

מתזמן ציבורי @Bean מתוזמן ציבורי (טריגר טריגר, משרת JobDetail, מפעל SchedulerFactoryBean) זורק מתזמן חריג {מתזמן מתזמן = factory.getScheduler (); scheduler.scheduleJob (עבודה, טריגר); scheduler.start (); מתזמן החזרה; }

5.2. אביב מתזמן מפעל שעועית

האביב מתזמן מפעל שעועית מספק שימוש בסגנון שעועית להגדרת תצורה של מתזמן, מנהל את מחזור החיים שלה במסגרת ההקשה, וחושף את ה- מתזמן כשעועית להזרקת תלות:

@Bean SchedulerFactory ציבורי מתזמן (טריגר טריגר, JobDetail עבודה, DataSource quartzDataSource) {SchedulerFactoryBean schedulerFactory = חדש SchedulerFactoryBean (); schedulerFactory.setConfigLocation (ClassPathResource חדש ("קוורץ. נכסים")); schedulerFactory.setJobFactory (springBeanJobFactory ()); schedulerFactory.setJobDetails (עבודה); schedulerFactory.setTriggers (טריגר); schedulerFactory.setDataSource (quartzDataSource); מתזמן החזרה מפעל; }

5.3. הגדרת תצורה SpringBeanJobFactory

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

עם זאת, הוא חסר תמיכה בהזרקת הפניות שעועית מה הקשר יישום. תודה למחבר פוסט בבלוג זה, אנו יכולים להוסיף חיווט אוטומטי תמיכה ל SpringBeanJobFactory ככה:

@Bean ציבורי SpringBeanJobFactory springBeanJobFactory () {AutoWiringSpringBeanJobFactory jobFactory = AutoWiringSpringBeanJobFactory חדש (); jobFactory.setApplicationContext (applicationContext); להחזיר את JobFactory; }

6. מסקנה

זה הכל. הרגע בנינו את מתזמן הבסיס הראשון שלנו באמצעות ממשק ה- API של קוורץ וכן בשיעורי הנוחות של אביב.

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

השלם קוד מקור לדוגמא זמין בפרויקט github זה. זהו פרויקט Maven שניתן לייבא ולהפעיל כפי שהוא. הגדרת ברירת המחדל משתמשת בשיעורי הנוחות של Spring, שניתן לעבור בקלות ל- API של קוורץ באמצעות פרמטר זמן ריצה (עיין ב- README.md במאגר).