07. december 2005 - 14:42Der er
9 kommentarer og 1 løsning
Start af javaprogram fra et andet javaprogram
Jeg har en applikation (Client) der har nogle quartz schedulerede jobs som den står og afvikler. Ind i mellem skal denne applikation opdateres og i den forbindelse er der brug for en genstart af applikationen. Min ide er at lave en anden Java-applikation (StartClient) der bliver startet når opdateringen af Client er startet, (Client laver her en system.exit(exitcode)). StartClient skal så vente lidt og derefter genstarte Client og selv lave en system.exit(0). Hvis Client stadig er igang med opdateringen gentager ovenstående sig. Men hvordan får jeg et javaprogram til at starte et andet program ? Jeg har tidligere prøvet noget lignende med hvor jeg fra javaprogrammet kunne kalde en .bat fil, men det er ikke løsningen her da det skal være platforms-uafhængigt.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Hvis du vil til at lytte på processes, og det vil jeg mene du skal hvis du skal vente på at et program lukker ned, så bliver det svært at lave platformsuafhængigt.
Den rigtige løsning er at: - ligge din app i en egen jar fil - lave en driver app som laver en URLClassLoader med den jar fil - loader med classloader og kalder din app i en tråd - i baggrunden checker om der kommer en ny jar fil - når det sker så stopper den tråde, GC'er classloaderen og starter forfra
public class SuperDynamic { private static void PGen(Date d) { try { OutputStream os = new FileOutputStream("test/P.java"); PrintStream ps = new PrintStream(os); ps.println("public class P extends Thread {"); ps.println(" public void run() {"); ps.println(" try {"); ps.println(" while(true) {"); ps.println(" System.out.println(\"" + d + "\");"); ps.println(" Thread.sleep(1000);"); ps.println(" }"); ps.println(" } catch(Exception e) {"); ps.println(" }"); ps.println(" }"); ps.println("}"); ps.close(); os.close(); Runtime.getRuntime().exec("javac -d test test/P.java").waitFor(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { (new File("test")).mkdir(); URL[] url = new URL[1]; url[0] = new URL("file:test/"); for(int i = 0; i < 3; i++) { PGen(new Date()); URLClassLoader cl = new URLClassLoader(url); Thread p = (Thread)Class.forName("P", true, cl).newInstance(); p.start(); Thread.sleep(2500); p.interrupt(); p.join(); cl = null; }
} }
output:
Wed Dec 07 19:10:41 EST 2005 Wed Dec 07 19:10:41 EST 2005 Wed Dec 07 19:10:41 EST 2005 Wed Dec 07 19:10:44 EST 2005 Wed Dec 07 19:10:44 EST 2005 Wed Dec 07 19:10:44 EST 2005 Wed Dec 07 19:10:48 EST 2005 Wed Dec 07 19:10:48 EST 2005 Wed Dec 07 19:10:48 EST 2005
Jeg forsøger at styre applikationen via en klasse ApplicationController.java Her har jeg en start, stop og restart metode. (restart kalder stop og dernæst start) ApplicationController har p og cl som statiske objekter. start indlæser min jar fil i URLClassLoader'en og starter tråden p.
Stop forsøger at stoppe p med følgende p.destroy(); p.interrupt(); p.join(); cl = null;
for dernæst at slette resource.jar filen og omdøbe den nye resource2.jar fil til resource.jar. MEN jeg kan ikke slette resource.jar - min applikation har åbenbart lås på den på en eller anden måde. Og det hænger nok også sammen med at det ikke ser ud til at min applikation bliver slukket korrekt ned.
Den applikation jeg starter er en klasse der v.hj.a. Quartz starter en række jobs. Hvordan får jeg de jobs lukket korrekt ned igen ? Den klasse der starter applikationen og forsøger at opdatere den styres også af Quartz.
Vi har ændret vores approach, og forventer at vi kan få løst vores problemer ved at dritribuere applikationen v.hj.a InstallShield.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.