Menambahkan Hooks Shutdown untuk Aplikasi JVM

1. Ikhtisar

Biasanya mudah untuk memulai layanan. Namun, terkadang kita perlu memiliki rencana untuk menutupnya dengan baik.

Dalam tutorial ini, kita akan melihat berbagai cara menghentikan aplikasi JVM. Kemudian, kita akan menggunakan Java API untuk mengelola hook shutdown JVM. Silakan merujuk ke artikel ini untuk mempelajari lebih lanjut tentang mematikan JVM di aplikasi Java.

2. Shutdown JVM

JVM dapat ditutup dengan dua cara berbeda:

  1. Proses yang terkontrol
  2. Cara yang tiba-tiba

Proses terkontrol mematikan JVM jika:

  • Utas non-daemon terakhir berakhir. Misalnya, ketika utas utama keluar, JVM memulai proses mematikannya
  • Mengirim sinyal interupsi dari OS. Misalnya, dengan menekan Ctrl + C atau keluar dari OS
  • Memanggil System.exit () dari kode Java

Meskipun kita semua berusaha untuk mematikan dengan baik, terkadang JVM mungkin mati secara tiba-tiba dan tidak terduga. JVM mati secara tiba-tiba saat :

  • Mengirim sinyal mematikan dari OS. Misalnya dengan mengeluarkan kill -9
  • Memanggil Runtime.getRuntime (). Halt () dari kode Java
  • OS host mati tiba-tiba, misalnya, dalam kegagalan daya atau OS panik

3. Hooks Shutdown

JVM memungkinkan fungsi registrasi untuk dijalankan sebelum menyelesaikan shutdown-nya. Fungsi-fungsi ini biasanya merupakan tempat yang baik untuk melepaskan sumber daya atau tugas pemeliharaan rumah serupa lainnya. Dalam terminologi JVM, fungsi-fungsi ini disebut s hutdown hooks .

Kait shutdown pada dasarnya diinisialisasi tetapi utas yang belum dimulai . Ketika JVM memulai proses mematikannya, itu akan memulai semua hook yang terdaftar dalam urutan yang tidak ditentukan. Setelah menjalankan semua hook, JVM akan berhenti.

3.1. Menambahkan Hooks

Untuk menambahkan hook shutdown, kita bisa menggunakan metode Runtime.getRuntime (). AddShutdownHook () :

Thread printingHook = new Thread(() -> System.out.println("In the middle of a shutdown")); Runtime.getRuntime().addShutdownHook(printingHook);

Di sini kami hanya mencetak sesuatu ke output standar sebelum JVM mati sendiri. Jika kami menutup JVM seperti berikut:

> System.exit(129); In the middle of a shutdown

Kemudian kita akan melihat bahwa hook benar-benar mencetak pesan ke keluaran standar.

JVM bertanggung jawab untuk memulai utas kait . Oleh karena itu, jika hook yang diberikan sudah dimulai, Java akan memunculkan pengecualian:

Thread longRunningHook = new Thread(() -> { try { Thread.sleep(300); } catch (InterruptedException ignored) {} }); longRunningHook.start(); assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(longRunningHook)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Hook already running"); 

Jelas, kami juga tidak dapat mendaftarkan hook beberapa kali:

Thread unfortunateHook = new Thread(() -> {}); Runtime.getRuntime().addShutdownHook(unfortunateHook); assertThatThrownBy(() -> Runtime.getRuntime().addShutdownHook(unfortunateHook)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("Hook previously registered");

3.2. Menghapus Kait

Java menyediakan metode penghapusan kembar untuk menghapus hook shutdown tertentu setelah mendaftarkannya:

Thread willNotRun = new Thread(() -> System.out.println("Won't run!")); Runtime.getRuntime().addShutdownHook(willNotRun); assertThat(Runtime.getRuntime().removeShutdownHook(willNotRun)).isTrue(); 

Metode removeShutdownHook () mengembalikan nilai true ketika hook shutdown berhasil dihapus.

3.3. Peringatan

JVM menjalankan hook shutdown hanya jika terjadi penghentian normal. Jadi, ketika kekuatan eksternal membunuh proses JVM secara tiba-tiba, JVM tidak akan mendapat kesempatan untuk mengeksekusi hook shutdown. Selain itu, menghentikan JVM dari kode Java juga akan memiliki efek yang sama:

Thread haltedHook = new Thread(() -> System.out.println("Halted abruptly")); Runtime.getRuntime().addShutdownHook(haltedHook); Runtime.getRuntime().halt(129); 

The berhenti Metode paksa mengakhiri JVM sedang berjalan. Oleh karena itu, hook shutdown yang terdaftar tidak akan mendapat kesempatan untuk dieksekusi.

4. Kesimpulan

Dalam tutorial ini, kami melihat berbagai cara aplikasi JVM dapat dihentikan. Kemudian, kami menggunakan beberapa API runtime untuk mendaftarkan dan membatalkan pendaftaran hook shutdown.

Seperti biasa, kode sampel tersedia di GitHub.