הפעלה מחדש באופן פרוגרמטי של יישום אתחול האביב

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

במדריך זה נראה כיצד באופן פרוגרמטי הפעל מחדש את יישום Spring Boot.

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

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

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

כעת, בואו נבדוק דרכים שונות בהן אנו יכולים ליישם את ההפעלה מחדש של יישום Spring Boot.

2. הפעל מחדש על ידי יצירת הקשר חדש

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

בואו נראה כיצד ליישם זאת ב- רָאשִׁי השיטה של ​​אפליקציית Spring Boot:

@SpringBootApplication מחלקה ציבורית יישום {הקשר סטטי פרטי ConfigurableApplicationContext; סטטי ציבורי ריק ריק (String [] args) {context = SpringApplication.run (Application.class, args); } הפעלה מחדש של ריק סטטי ציבורי () {ApplicationArguments args = context.getBean (ApplicationArguments.class); שרשור הברגה = שרשור חדש (() -> {context.close (); context = SpringApplication.run (Application.class, args.getSourceArgs ());}); thread.setDaemon (שקר); thread.start (); }}

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

בנוסף, בואו להוסיף נקודת קצה של REST שדרכה נוכל להפעיל את ההפעלה מחדש:

@RestController מחלקה ציבורית RestartController {@PostMapping ("/ הפעלה מחדש) הפעלה מחדש של חלל ציבורי () {Application.restart (); }}

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

לאחר מכן נוכל להתקשר לנקודת הקצה החדשה שלנו כדי להפעיל מחדש את היישום:

curl -X POST localhost: יציאה / הפעלה מחדש

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

3. נקודת הקצה להפעלה מחדש של המפעיל

דרך נוספת להפעיל מחדש את היישום שלנו היא להשתמש במובנה RestartEndpoint מ מפעיל אתחול האביב.

ראשית, בוא נוסיף את התלות הנדרשת של Maven:

 org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-cloud-starter 

לאחר מכן, עלינו לאפשר את נקודת הקצה מחדש המובנית ב- application.properties קוֹבֶץ:

management.endpoint.restart.enabled = נכון

כעת לאחר שהקמנו הכל, נוכל להזריק את איתחולנקודת קצה לשירות שלנו:

@Service מחלקה ציבורית RestartService {@ RestartEndpoint פרטית אוטומטית פרטית מחדש Endpoint; הפעלה מחדש של חלל ציבורי App () {restartEndpoint.restart (); }}

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

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

4. רענון הקשר האפליקציה

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

למרות ששיטה זו עשויה להישמע מבטיחה, רק חלק מסוגי ההקשר ליישומים תומכים ברענון הקשר שכבר יזם. לדוגמה, FileSystemXmlApplicationContext, GroovyWebApplicationContext, וכמה אחרים תומכים בזה.

למרבה הצער, אם ננסה זאת ביישום אינטרנט של Spring Boot, נקבל את השגיאה הבאה:

java.lang.IllegalStateException: GenericApplicationContext אינו תומך בניסיונות רענון מרובים: פשוט קוראים 'רענן' פעם אחת

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

5. מסקנה

במאמר זה בחנו מספר דרכים שונות כיצד להפעיל מחדש את יישום Spring Boot בתכנות.

כמו תמיד, אנו יכולים למצוא את קוד המקור של הדוגמאות ב- GitHub.