# Prozess-Handling einer Batch-Datei mittels JSP



## KartoffelKiffer (3. Nov 2006)

Hallo,

ein blödes Problem erhascht mich bereits am frühen Morgen.

Und zwar habe ich eine JSP-Datei, die mittels "Process p = Runtime.getRuntime().exec(file);" einen Prozess auf dem Server startet. Wenn ich nur einen Client habe, der nicht gleichzeitig mehrmals dieselbe JSP-Datei aufruft, kommt es da zu keinen Problemen (der Prozess darf nur einmal starten, wenn 2 gleichzeititg laufen gibts es fiese Konflikte, die ich nicht abfangen kann).

Nun ist es natürlich so, dass nicht alle Kunden brav warten, bis der Nachbar aus Fernost-Asien die JSP-Datei aufgerufen hat und dann noch 2 Sekunden Karenz duldet bis der Prozess auch wirklich abgeschlossen ist. Nein, sie starten das Script gleichzeitig.

Jetzt komm ich leider mit der Geschichte nicht auf den grünen Zweig, sodass ich sagen könnte "Ich hab das was, was 100%ig läuft" - und das muss es leider auch wirklich. Priorität Nr. 1 ist also, dass der Prozess nur einmal laufen darf.

Meine ersten Ansätze verliefen in Richtung Flags. Ich erzeuge bevor der Prozess anläuft eine temp.-Datei, und lösche sie demnach wieder, wenn der Prozess abgeschlossen ist (der Prozess ist eine Batch-Datei, die am Ende ein delete der Datei auslöst).

Frage ich nun also ab, bevor ich den Prozess starte, ob die temp.-Datei vorhanden ist; Wenn dies der Fall ist, hänge dich in einer While-Schleife auf, und Frage alle Sekunde ab, ob Datei gelöscht ist (wenn Datei gelöscht -> Prozess beendet).

So nun zum eigentlichen Knackpunkt der Story: Gehen z.B. 17 Leute gleichzeitig auf die JSP (unwarscheinlich, aber WENN, ist die K***e am dampfen) sitzen 16 davon in der Warteschleife fest. Nur einer (der Erste) darf den Prozess anschmeißen und setzt diesen Flag (die temp.-Datei), der die Anderen dazu verdonnert in der Schleife zu warten. Warten jetzt also im 1-Sek Abstand 16 Leute darauf, dass eine Datei gelöscht wird, kommt es unweigerlich zu der Tatsache, dass 2 im exakt gleichen Zeitpunkt bemerken "Aha, die Datei ist gelöscht RAUS AUS DER SCHLEIFE".

Und das ist mein Problem, es kommen dann 2 Clients zu dem Entschluss jetzt den Prozess anzuschmeißen, und wie erwähnt darf das nicht der Fall sein.

Es ist mir bisher nicht gelungen ein geeignetes Handling dafür einfallen zu lassen und hoffe daher ein wenig auf Eure Hilfe.

Es muss also explizit der Fall sein, nur 1 Client darf den Prozess anwerfen, alle anderen haben zu warten bis der Prozess beendet ist. Ist er beendet, darf auch nur EIN weiterer Client den Prozess anschmeißen, alle Anderen haben zu warten usw.

Wenn Ihr also Ideen habt, nur her damit; Mir fällt leider nicht gescheihtes mehr dazu ein.



Mfg Tom


----------



## dsv fritz (3. Nov 2006)

Was du brauchts ist entweder eine Kollisionsdetektion oder eine Criticall section.
Ich weiss nicht, ob's dir weiter hilft, aber schau dir mal die grundlegende Idee von CSMA/CD (de.wikipedia.org/wiki/CSMA/CD).


----------



## KartoffelKiffer (3. Nov 2006)

Hallo fritz,

der Wikipedia-Link macht mich etwas schlauer, danke dafür, ist exakt das, was ich benötige.

Die Grafik zeigt genau mein Problem auf. Nur muss ich tatsächlich diesen Ablaufplan selber programmieren? Ist ein solches Handling nicht bereits schon verfügbar?



Mfg Tom


----------



## dsv fritz (3. Nov 2006)

Anonymous hat gesagt.:
			
		

> Ist ein solches Handling nicht bereits schon verfügbar?


Gute Frage... leider kenn ich jetzt nicht gerade eine pfannenfertige Lösung, sonst hätte ich sie dir gegeben.


----------

