השבת יישום אתחול האביב

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

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

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

למידע נוסף על אופן הגדרת פרויקט באמצעות Spring Boot, עיין במאמר Spring Boot Starter או עיין בתצורת Boot Boot.

2. נקודת סיום כיבוי

כברירת מחדל, כל נקודות הקצה מופעלות ביישום אתחול האביב למעט /לכבות; זה, מטבע הדברים, חלק מה- מַפעִיל נקודות קצה.

הנה התלות של Maven להגדרת אלה:

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

ואם אנו רוצים להגדיר גם תמיכה ביטחונית, אנו זקוקים ל:

 org.springframework.boot spring-boot-starter-security 

לבסוף, אנו מאפשרים את נקודת הסיום לכיבוי ב- application.properties קוֹבֶץ:

management.endpoints.web.exposure.include = * management.endpoint.shutdown.enabled = true endpoints.shutdown.enabled = true

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

כדי לכבות את יישום Spring Boot, אנו פשוט קוראים לשיטת POST כזו:

curl -X POST localhost: יציאה / מפעיל / כיבוי

בשיחה זו, נמל מייצג את יציאת המפעיל.

3. סגור את הקשר היישום

אנחנו יכולים גם לקרוא סגור() שיטה ישירות באמצעות הקשר היישום.

נתחיל בדוגמה ליצירת הקשר וסגירתו:

ConfigurableApplicationContext ctx = new SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); System.out.println ("יישום אתחול האביב התחיל"); ctx.getBean (TerminateBean.class); ctx.close ();

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

מחלקה ציבורית TerminateBean {@PreDestroy חלל ציבורי onDestroy () זורק חריג {System.out.println ("מיכל האביב נהרס!"); }}

עלינו להוסיף שעועית מסוג זה:

@Configuration class class ShutdownConfig {@Bean public TerminateBean getTerminateBean () {החזר TerminateBean חדש (); }}

הנה הפלט לאחר הפעלת דוגמה זו:

יישום Boot Boot התחיל להיסגר [מוגן באמצעות דוא"ל] DefaultLifecycleProcessor - עצירת שעועית בשלב 0 ביטול הרישום של שעועית חשופה ל- JMX בעת כיבוי מיכל האביב נהרס!

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

3.1. סגור את הקשר היישום הנוכחי

בדוגמה שלמעלה, יצרנו הקשר של יישום ילד והשתמשנו ב- סגור() שיטה להשמיד את זה.

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

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

@RestController מחלקה ציבורית ShutdownController מיישם ApplicationContextAware {הקשר ApplicationContext פרטי; @PostMapping ("/ shutdownContext") shutdownContext ריק () הקשר (({(ConfigurableApplicationContext) הקשר) .close (); } @Override public void setApplicationContext (ApplicationContext ctx) זורק BeansException {this.context = ctx; }}

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

לאחר מכן נוכל להתקשר לנקודת הקצה החדשה שלנו כדי לסגור את ההקשר הנוכחי:

curl -X POST localhost: port / shutdownContext

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

4. יציאה אביב יישום

אביב יישום רושמים א לכבות חבר ל- JVM כדי לוודא שהיישום יוצא כראוי.

שעועית עשויה ליישם את ExitCodeGenerator ממשק להחזרת קוד שגיאה ספציפי:

ConfigurableApplicationContext ctx = new SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE) .run (); int exitCode = SpringApplication.exit (ctx, ExitCodeGenerator חדש () {@Override public int getExitCode () {// להחזיר את קוד השגיאה להחזיר 0;}}); System.exit (exitCode);

אותו קוד עם היישום של Java 8 lambdas:

SpringApplication.exit (ctx, () -> 0);

לאחר שהתקשר ל System.exit (יציאת קוד), התוכנית מסתיימת עם קוד החזרה 0:

התהליך הסתיים עם קוד יציאה 0

5. הרגו את תהליך האפליקציה

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

SpringApplicationBuilder app = חדש SpringApplicationBuilder (Application.class) .web (WebApplicationType.NONE); app.build (). addListeners (ApplicationPidFileWriter חדש ("./ bin / shutdown.pid")); app.run ();

לאחר מכן, צור shutdown.bat קובץ עם התוכן הבא:

להרוג $ (cat ./bin/shutdown.pid)

הביצוע של shutdown.bat מחלץ את מזהה התהליך מה- shutdown.pid קובץ ומשתמש ב- לַהֲרוֹג פקודה לסיים את יישום האתחול.

6. מסקנה

במכתב מהיר זה, סקרנו כמה שיטות פשוטות שניתן להשתמש בהן כדי לסגור יישום Spring Boot.

אמנם על המפתח לבחור שיטה מתאימה; יש להשתמש בכל השיטות הללו בתכנון ובכוונה.

לדוגמה, .יְצִיאָה() עדיף כאשר אנו צריכים להעביר קוד שגיאה לסביבה אחרת, אמור JVM לפעולות נוספות. באמצעותיישוםPID נותן גמישות רבה יותר, מכיוון שנוכל גם להפעיל או להפעיל מחדש את היישום עם שימוש בסקריפט bash.

סוף כל סוף, /לכבותנמצא כאן כדי לאפשר לסיים את היישומים באופן חיצוני באמצעות HTTP. לכל שאר המקרים .סגור() יעבוד בצורה מושלמת.

כרגיל, הקוד השלם למאמר זה זמין בפרויקט GitHub.


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