Daniel Jacobsen skrev
> Hvordan kan jeg få mit Java-program til at lukke ned og starte op igen??
Start dit program fra en kommando fil du selv skriver (en .bat-fil under
Windows, en .sh-fil under Unix) hvori du hopper tilbage og genstarter hvis
en bestemt betingelse er opfyldt. Som betingelse kan du fx. benytte
returstatus fra programmet, dvs. du afslutter dit program med et kald til
"System.exit(RESTART_STATUS)" og tester for den værdi i dit shellscript.
Hvis værdien er 100 vil det i en .bat-fil vil det se ud som
restart:
javaw my.program
if errorlevel 100 goto restart
I stedet for returstatus kan du også benytte eksistensen af en (tom) fil som
signal til at genstarte, hvilke er en metode der ofte ses under Unix. Denne
fil slettes ubetinget lige før start af programmet, og der hoppes til
genstart hvis den er der når programmet er afsluttet. Bemærk, at denne
metode er svær at lave ordentligt hvis der er flere kørende instanser af
programmet samtidig.
En helt anden måde at genstarte dit program på, kunne være at skrive en
lille loader-klasse (helt med sin egen main metode) der via en ny
classloader instantiere og kalder main i den egentlige main-klasse.
Loader-klassen kan så fx. tilbyde en eller anden statisk metode igennem
hvilken dit øvrige program kan bede om en genstart. Når din main-klasse så
returnere fra main metoden, kan loader-klassen, hvis genstart er blevet
anmodet, instantiere en ny main-klasse og kalde main metoden en gang til. Er
genstart ikke blevet anmodet afslutter loader-klasse blot som normalt.
Fordelen ved denne metode er, at der ikke bruges tid på at genstarte JVM'en
og, at der ikke behøver blive skrevet nogen kommando-fil til at starte
programmet med (man starter blot med en et andet klassenavn). Ulempen ved
metoden er, at JVM'en ikke genstartes (!) og der derfor ikke nødvendigvis
bliver ryddet helt op i fx. åbne filer før efter genstart. Loader-klassen
kan selvfølgelig stimulere til og vente på oprydning, men pga. Javas garbage
collect model er der ingen garantier. Ulempen er også, at metoden er teknisk
noget mere langhåret at forstå, så hvis der er problemer kan det være svært
at se hvad der er galt.
Metoden med at starte en klasse via en ny classloader er ofte benyttet i
programmer der skal kunne hente og køre en ny version af en plug-in uden at
genstarte hele programmet, så man kan sikkert med fordel snuppe noget fra
diverse open-source programmer med denne feature.
Med venlig hilsen,
--
Filip Larsen <filip.larsen@mail.dk>
|