Thursday, February 09, 2006

Menggunakan Shutdown Hook: Bersihkan dosa sebelum mati :)

Pada saat aplikasi mati, baik itu diinginkan ataupun tidak (misalnya karena ada error), kadang perlu dilakukan proses akhir sehingga tidak menimbulkan sesuatu hal yang tidak diingankan, misalnya hilangnya data, tidak ter-commit-nya suatu transaction dan lain-lain. Beberapa contoh proses pada saat aplikasi mati diantaranya:
  • Mematikan koneksi jaringan
  • Menyimpan session state
  • Menghapus file sementara (temporary)
  • Menutup file handle

Untuk melakukan proses akhir tersebut kita bisa menggunakan solusi dengan cara:
  • Buat suatu fungsi yang akan dipanggil disetiap baris yang membuat aplikasi mati atau disetiap baris sebelum memanggil System.exit()

Tapi solusi tersebut tentu saja tidak efektif karena kita harus menuliskan kode pemanggil fungsi tersebut disetiap bagian dimana memungkinkan aplikasi mati.

Solusi yang baik adalah menggunakan shutdown hook yang ada pada standar Java API.

Shutdown hook:
  • Meknisme shutdown hook sudah ada sejak Java 1.3.
  • Sebelumnya kita dapat menggunakan Runtime.runFinalizersOnExit(), yang sekarang ini sudah deprecated.
  • Dengan shutdown hook pemberhentian suatu aplikasi dengan sengaja (voluntary) tau tidak sengaja dapat ditangani dengan baik.
  • Sebuah shutdown hook adalah sebuah class Thread dengan method run() yang kita isi dengan kode yang akan dipanggil sebelum JVM mati.
  • Kita dapat meregistrasi beberapa shoutdown hook dalam suatu aplikasi.
  • 3 Method pada class java.lang.Runtime yang berhubungan dengan mekanisme 'exit' suatu aplikasi yang perlu dipelajari (baca dokumentasi Java API)
    • addShutdownHook
    • removeShutdownHook
    • halt
  • Tips:
    • Gunakan kode yang thread-safe pada shutdown hook
    • Buat kode yang sederhana dan cepat dieksekusi sehingga mempercepat waktu shutdown
  • Contoh dibawah ini memperlihatkan penggunaan shutdown hook:
package com.ejlp.test.shutdownhook;

import java.io.*;

public class TestShutdownHook {
private BufferedWriter bw_log;

public TestShutdownHook() throws IOException {
// Buat file log.txt
bw_log = new BufferedWriter(new FileWriter("log.txt"));

// Register sebuah shutdown hook
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
// Tutup log file
bw_log.close();
}
catch (IOException e) {
System.err.println(e);
}
}
});;
}

// Tulis sesuatu ke file log.txt
public void processApp1() throws IOException {
bw_log.write("Jika tidak ada shutdown hook yang menutup bw_log, tulisan ini tidak adakan ada di log.txt");
bw_log.newLine();
}

public static void main(String args[]) {
try {
TestShutdownHook demo = new TestShutdownHook();
demo.processApp1();
} catch (IOException e) {
e.printStackTrace();
}

// Simulasikan program error
throw new RuntimeException();
}
}

Followers