הוספת ווי כיבוי ליישומי JVM

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

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

במדריך זה נבחן דרכים שונות ליישום JVM להפסיק. לאחר מכן נשתמש בממשקי API של Java לניהול ווים לכיבוי JVM. אנא עיין במאמר זה למידע נוסף על כיבוי JVM ביישומי Java.

2. כיבוי JVM

ניתן לכבות את ה- JVM בשתי דרכים שונות:

  1. תהליך מבוקר
  2. דרך פתאומית

תהליך מבוקר מכבה את ה- JVM כאשר:

  • החוט האחרון שאינו שדי מסתיים. לדוגמה, כשיצא החוט הראשי, ה- JVM מתחיל בתהליך הכיבוי שלו
  • שליחת אות הפסקה ממערכת ההפעלה. למשל, על ידי לחיצה על Ctrl + C או כניסה מהמערכת
  • יִעוּד System.exit () מקוד Java

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

  • שליחת אות הרג ממערכת ההפעלה. לדוגמא, על ידי הנפקת א להרוג -9
  • יִעוּד Runtime.getRuntime (). עצור () מקוד Java
  • מערכת ההפעלה המארחת מתה באופן בלתי צפוי, למשל, בכשל חשמל או בבהלה של מערכת ההפעלה

3. כיבוי ווי

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

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

3.1. הוספת ווים

על מנת להוסיף וו כיבוי, אנו יכולים להשתמש ב- Runtime.getRuntime (). AddShutdownHook () שיטה:

חוט printingHook = חוט חדש (() -> System.out.println ("באמצע כיבוי")); Runtime.getRuntime (). AddShutdownHook (printingHook);

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

> System.exit (129); באמצע כיבוי

ואז נראה שהוו למעשה מדפיס את ההודעה לפלט רגיל.

ה- JVM אחראי על הפעלת חוטי וו. לכן, אם הוו הנתון כבר התחיל, ג'אווה תשליך חריג:

שרשור longRunningHook = שרשור חדש (() -> {נסה {Thread.sleep (300);} לתפוס (התעלם מ- InterruptedException) {}}); longRunningHook.start (); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (longRunningHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("הוק כבר פועל"); 

ברור שאנחנו גם לא יכולים לרשום וו מספר פעמים:

חוט unfortunateHook = חוט חדש (() -> {}); Runtime.getRuntime (). AddShutdownHook (unfortunateHook); assertThatThrownBy (() -> Runtime.getRuntime (). addShutdownHook (unfortunateHook)) .isInstanceOf (IllegalArgumentException.class) .hasMessage ("הוק רשום בעבר");

3.2. הסרת ווים

ג'אווה מספקת תאום לְהַסִיר שיטה להסרת וו כיבוי מסוים לאחר רישומו:

הברגה willNotRun = שרשור חדש (() -> System.out.println ("לא יפעל!")); Runtime.getRuntime (). AddShutdownHook (willNotRun); assertThat (Runtime.getRuntime (). removeShutdownHook (willNotRun)). isTrue (); 

ה removeShutdownHook () השיטה מחזירה נָכוֹן כאשר וו הכיבוי מוסר בהצלחה.

3.3. אזהרות

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

חוט haltedHook = חוט חדש (() -> System.out.println ("נעצר בפתאומיות")); Runtime.getRuntime (). AddShutdownHook (haltedHook); Runtime.getRuntime (). עצור (129); 

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

4. מסקנה

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

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


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