JavaSvet - otvorena java zajednica

 
glavna stranica arr2javasvet  english version arr2java.net

Hvatanje signala za gašenje JVM

Igor Spasić
30 Dec 2004

Za aplikaciju je jako važno da pravilno radi sa resuresima, što uglavnom znači da treba da ih zatvori/ugasi/oslobodi kada više nisu potrebni. To se posebno odnosi na sam kraj rada sa aplikacijom kada baš sve otvorene resurse, uključujući i one iz kojekakvih poolova treba pozatvarati. Čini se da Java developeri pomalo zaboravljaju ovaj slučaj usled nedostatka destruktora, potpuno se oslanjajući na garbage collector, koji, jasno, nije svemoguć i za koji se zna čemu služi.

Sve je u redu kada su korisnici disciplinovani i kada na pravilan način ugase aplikaciju. Realni slučaj, naravno, nije takav, i korisnici često znaju da, namerno ili slučajno, "ubiju" konzolu. Svako neregularno zatvaranje aplikacije može da ostavi pregršt otvorenih resursa što može da se na najrazličitije načine odrazi na stanje sistema (na pr.: da se "istroše" sve konekcije ka bazi itd.).

Počevši od Jave 1.3, postoji način da se "uhvati" (hook-uje) signal za gašenje JVM. Reč je o tkzv. JVM Shutdown Hook. Hook je kod koji se izvršava uvek pre nego što Javina VM krene u proces gašenja, bez obzira da li se aplikacija zatvara regularnim putem ili nregularno, tj. nasilno. Jasno je da JVM Shutdown Hook obično sadrži ili poziva logiku za zatvaranje svih otvorenih resursa.

Sa implementacione strane, stvari su strašno jednostavne. JVM Shutdown Hook je običan Thread koje je inicijalizovan, ali još nije startovan:

class ShutdownHook extends Thread {
   
...
   
public void run() {
   
...
   
}
}

Instancu takvog Threada treba registrovati kao JVM Shutdown Hook sledećim pozivom:

ShutdownHook hook = new ShutdownHook(...);
Runtime.getRuntime
().addShutdownHook(hook);

I to je sve. Kada JVM dobije signal za gašenje, startovaće prvo hook thread. Obično hook thread prilikom inicijalizacije dobije instancu na neki glavni menadžer aplikacije koji "zna" kako da oslobodi resurse.

Primer

Mali primer za download.