מדריך ShedLock עם אביב

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

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

במדריך קצר זה, נבחן את ShedLock - ספריית Java שמוודאת שהמשימות המתוזמנות שלנו פועלות רק פעם אחת באותו זמן. ומהווה אלטרנטיבה לקוורץ.

2. תלות Maven

כדי להשתמש ב- ShedLock עם Spring, עלינו להוסיףה מעיין-סתימה תלות:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. תצורה

שים לב כי ShedLock פועל רק בסביבות עם בסיס נתונים משותף על ידי הכרזה על תקינות LockProvider. זה יוצר טבלה או מסמך במסד הנתונים שבו הוא מאחסן את המידע על המנעולים הנוכחיים.

נכון לעכשיו, ShedLock תומך ב- Mongo, Redis, Hazelcast, ZooKeeper וכל דבר עם נהג JDBC.

לדוגמא זו, נשתמש במסד נתונים H2 בזיכרון. כדי שזה יעבוד, עלינו לספק את מסד הנתונים H2 ואת התלות ב- JDBC של ShedLock:

 net.javacrumbs.shedlock Shedlock-provider-jdbc-template 2.1.0 com.h2database h2 1.4.200 

לאחר מכן עלינו ליצור טבלת מסד נתונים עבור ShedLock כדי לשמור על מידע על נעילות מתזמנים:

CREATE TABLE Shocklock (שם VARCHAR (64), lock_until TIMESTAMP (3) NULL, נעול_ at TIMESTAMP (3) NULL, נעול_על VARCHAR (255), מפתח ראשוני (שם))

עלינו להכריז על מקור הנתונים בקובץ המאפיינים של היישום Spring Boot שלנו כך ש- מקור מידע שעועית יכולה להיות חוטית אוטומטית. בדוגמה זו אנו משתמשים ב- application.yml להגדרת מקור הנתונים של מסד הנתונים H2:

קפיץ: מקור נתונים: driverClassName: org.h2. url של נהג: jdbc: h2: mem: shedlock_DB; INIT = צור סכימה אם לא קיים shutlock; DB_CLOSE_DELAY = -1; DB_CLOSE_ON_EXIT = שם משתמש שגוי: סיסמה: 

בואו להגדיר את LockProvider עם תצורת מקור הנתונים לעיל. האביב יכול לעשות את זה די פשוט:

@Configuration מחלקה ציבורית מתזמן תצורה {@Bean LockProvider ציבורי lockProvider (DataSource dataSource) {להחזיר JdbcTemplateLockProvider חדש (dataSource); }}

דרישת תצורה נוספת שעלינו לספק הן @EnableScheduling ו @EnableSchedulerLock הערות לשיעור תצורת האביב שלנו:

@SpringBootApplication @EnableScheduling @EnableSchedulerLock (defaultLockAtMostFor = "PT30S") יישום בכיתה ציבורית {public static void main (String [] args) {SpringApplication.run (SpringApplication.class, args); }}

ה defaultLockAtMostFor הפרמטר מציין את משך ברירת המחדל של הזמן שיש לנעול את המנעול במקרה שצומת הביצוע ימות. הוא משתמש בתבנית משך ISO8601.

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

4. יצירת משימות

כדי ליצור משימה מתוזמנת המטופלת על ידי ShedLock, פשוט שמנו את מתוזמן ו @SchedulerLock הערות על שיטה:

מחלקה @ Component BaeldungTaskScheduler {@Scheduled (cron = "0 0/15 * * *?") @SchedulerLock (name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") רישום פומבי // מתוזמן / מתוזמן ...}}

ראשית, בואו נסתכל על מתוזמן. זה תומך ב- קרון פורמט, כאשר הביטוי הזה פירושו "כל 15 דקות".

לאחר מכן, תסתכל על @SchedulerLock, ה שֵׁם הפרמטר צריך להיות ייחודי, ו ClassName_methodName מספיק בדרך כלל כדי להשיג זאת. אנחנו לא רוצים שיותר מריצה אחת של שיטה זו תתרחש בו זמנית, ושדלוק משתמש בשם הייחודי כדי להשיג זאת.

הוספנו גם כמה פרמטרים אופציונליים.

ראשית, הוספנו lockAtLeastForString כדי שנוכל לשים מרחק בין הפעלת שיטות. באמצעות "PT5M" פירושו ששיטה זו תחזיק את המנעול למשך 5 דקות, לכל הפחות. במילים אחרות, כלומר שיטה זו יכולה להיות מנוהלת על ידי ShedLock לא לעתים קרובות יותר מחמש דקות.

לאחר מכן, הוספנו lockAtMostForString כדי לציין כמה זמן יש לנעול את המנעול במקרה שצומת ההוצאה לפועל ימות. באמצעות "PT14M" פירושו שהוא יינעל לא יותר מ -14 דקות.

במצבים רגילים, ShedLock משחרר את הנעילה ישירות לאחר סיום המשימה. עכשיו לא היינו צריכים לעשות את זה כי יש ברירת מחדל הכלולה ב @EnableSchedulerLock, אבל בחרנו לעקוף את זה כאן.

5. מסקנה

במאמר זה למדנו כיצד ליצור ולסנכרן משימות מתוזמנות באמצעות ShedLock.

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


$config[zx-auto] not found$config[zx-overlay] not found