01: package webman.stager;
02:
03: import java.io.*;
04:
05: /**
06: * Diese Klasse ist ein Wrapper für den SiteReceiver in der Art, dass hierüber der SiteReceiver
07: * als neuer, unabhängiger Prozess gestartet wird und dessen System.out-Ausgaben durch den Wrapper
08: * ausgegeben werden. Sobald der SiteReceiver aber "End of HTTP output" schreibt, beendet sich der
09: * Wrapper, der SiteReceiver aber läuft weiter. Dieses Vorgehen erlaubt es, das CGI, welches den
10: * SiteReceiverLauncher startet, zu beenden, bevor der eigentliche SiteReceiver beendet ist. Das
11: * ist wiederum nötig, damit der ServerStarter auf der SenderSeite den InputStream zum CGI erhält,
12: * denn der wird solange nicht zurückgegeben, wie das CGI noch nicht beendet ist. Dadurch kommt es
13: * aber zu Problemen im zeitlichen Ablauf des Sendens und Empfangens, die schließlich dazu führen
14: * können, dass das CGI ein zweites Mal augerufen wird, vielleicht weil der erste Aufruf so lange
15: * dauert (genau genommen dauert es solange, den InputStream zu kriegen, weil ja der SiteReceiver
16: * erst beendet sein muss. Wenn z.B. der SiteReceiver eine große Site udpaten muss, er also lange
17: * braucht vom Start bis zum Ende, kann in der Verbindung zum CGI eine Exception geworfen werden,
18: * die zu einem neuen Verbindungsversuch führt, was einen weiteren SiteReceiver startet, wodurch
19: * sich 2 SiteReceiver überlagern, was zu Inkonsitenzen führt!)
20: * @author $Author: torsten $
21: * @version $Revision: 1.1 $
22: */
23: public class SiteReceiverLauncher {
24: /**
25: * startet SiteReceiver und beendet sich selbst nachdem SiteReceiver "end of http output" gesendet hat
26: * schreibt dessen Ausgaben nach stdout
27: * @param args Kommandozeilenparameter wie beim SiteReceiver
28: */
29: public static void main(String[] args) {
30: try {
31: //Aufrufparameter einfach durchgereicht; nur "java webman.stager.SiteReceiver" wird davor gesetzt
32: String javaHome = System.getProperty("java.home");
33: String javaProg = javaHome + File.separator + "bin"
34: + File.separator + "java";
35: String javaClasspath = System
36: .getProperty("java.class.path");
37: String[] newArgs = new String[args.length + 4];
38: newArgs[0] = javaProg;
39: newArgs[1] = "-classpath";
40: newArgs[2] = javaClasspath;
41: newArgs[3] = "webman.stager.SiteReceiver";
42: for (int x = 0; x < args.length; x++)
43: newArgs[x + 4] = args[x];
44: //Jetzt geht's los
45: Process proc = Runtime.getRuntime().exec(newArgs);
46: BufferedReader inReader = new BufferedReader(
47: new InputStreamReader(proc.getInputStream()));
48: //BufferedReader errReader = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
49: String line;
50: while ((line = inReader.readLine()) != null) {
51: System.out.println(line);
52: System.out.flush();
53: if (line.indexOf("end of http output") > -1) //Das ist das Ende!
54: {//muss baer noch an den ServerStarter gesandt werden, sonst denkt der, dass der SiteReceiver nicht funzt!!
55: System.exit(0);
56: }
57: }
58: } catch (Exception e) {
59: e.printStackTrace();
60: }
61: }
62: }
|