Java: Warten, bis Inhalt in einem Ordner vorhanden ist

springfloh18

Grünschnabel
Hallo,
es gibt zwar bereits einige Threads, die sich mit Warten beschäftigen, aber so richtig schlau werde ich da nicht draus.
Ich rufe einen Webservice auf, der mit verschiedenen Schnittstellen eine Datei erzeugt und in einem Ordner ablegt. Diese Datei soll dann weiterverarbeitet werden, durch erneuten Aufruf eines Webservices usw.

Hier ein kleiner Codeschnipsel:
Code:
//erster Aufruf des Webservices
this.executeWebservice1(...parameter1...);
//überprüfen, ob was im Ordner "ordnerName" enthalten ist
//getFileName listet die Dateinamen im Ordner auf
while (getFileNameIn(ordnerName) == null) {
	//warten....
}
this.executeWebservice2(...parameter...)

Ich hatte es erst mit dem hier in der while-Schleife versucht,
Code:
try {
      Thread.sleep(1000);
} catch (Exception e) {
	e.printStackTrace();
}
aber das macht das Ganze irgendwie nur furchtbar langsam und bringt nicht das gewünschte Ergebnis.

Danke für Eure Tips!
 
Warum benutzt du nicht Thread.yield()? Das reiht den Thread im Stack der auszuführenden Thread's wieder ganz unten ein. Mit anderen Worten, er setzt die restliche Bearbeitungszeit aus, wodurch alle anderen Threads die Restzeit bekommen.
Aber eigendlich sollte sleep() nichts langsamer machen, sofern du die Datei nicht mit den selben Thread erstellst. (Oder wenn du sleep im Hauptthread der in der main startet benutzt, weil dieser gleichzeitig die GUI zeichnet.)

Auf jeden Fall denke ich aber, dass 1 Sekunde für das erzeugen einer Datei auf einem Server viel zu lange sein dürfte. Mit yield schenkst du keine oder nur sehr geringe Zeit her.
Ach ja, und ich würde vermuten, dass "getFileNameIn" bei keiner Datei ein leeres Array zurückliefern würde. So würde ich es zumindest schreiben, das würde ich noch kontrollieren.
 
Zuletzt bearbeitet:
Doch, es dauert seeeeehhhr lange, bis die Datei da ist. im Schnitt etwa 15 Sekunden. In der durch den Webservice angesprochenen Schnittstelle werden 35.000 Werte ausgelesen und transformiert und danach in die Datei geschrieben. Das kann ich nicht beeinflussen, da die Schnittstelle so wie sie ist bereit gestellt wird.

Scheinbar funktioniert es auch irgendwie. Das Problem ist nun nur, dass 2mal gewartet werden muss.
  • Aufruf Webservice
  • warten auf Datei in Ordner 1
  • Aufruf Webservice mit Datei in Ordner1
  • warten auf Datei in Ordner2
  • Auslesen eines Wertes aus Datei in Ordner 2
  • Anzeige des Wertes in der GUI

Ich sehe im Ordner2, dass die Datei da ist, aber vorher scheint ein TimeOut oder sowas in der Art zu kommen:
The remote server disconnected unexpectedly
No response from server
Zur Erklärung: Ich deploye den ganzen Java-Kram auf einen Server, dann kann ich das Ganze übers Web aufrufen, Eingaben machen und Ergebnis anschaun.

Sorry, wenn ich mich etwas unverständlich ausdrücke, ist mein erstes Projekt in der Art. Mit Java hab ich aber schon Erfahrung ;-)
 
Ich glaube wir sollten erstmal klären wo genau die Zeit verloren geht.
Kannst du einen kleinen Zeitplan aufstellen, welcher dieser schritte wie lange dauert?

So wie sich das ganze bisher für mich anhört dauert es nunmal einfach so lange bis die Datei erstellt wurde. Das du dann natürlich darauf so lange warten muss ist also nicht deine schuld, sondern die des Webservices.

Wenn du das ganze mit einem Browser aufrufst, läuft der nach einer bestimmten Zeitspanne in ein Timeout. Wenn also das erstellen deiner Dateien längerdauert als dein Browser auf eine Antwort wartet, bekommst du dieses Timeout angezeigt, obwohl unter Umständen auf dem Server ja eigentlich alles Funktioniert hat nur eben etwas länger gedauert hat.
 
So wie sich das ganze bisher für mich anhört dauert es nunmal einfach so lange bis die Datei erstellt wurde. Das du dann natürlich darauf so lange warten muss ist also nicht deine schuld, sondern die des Webservices.

Wenn du das ganze mit einem Browser aufrufst, läuft der nach einer bestimmten Zeitspanne in ein Timeout. Wenn also das erstellen deiner Dateien längerdauert als dein Browser auf eine Antwort wartet, bekommst du dieses Timeout angezeigt, obwohl unter Umständen auf dem Server ja eigentlich alles Funktioniert hat nur eben etwas länger gedauert hat.

Hallo Johannes,
Ja ich denke auch, dass genau das das Problem ist, also dass es einfach zu lange dauert.

Zeitplan:
Eingaben in der GUI + Button drücken
ab jetzt läuft Ladebildschirm
--> Aufruf des Webservices
Webservice benötigt um die 15Sekunden für die Erzeugung der Datei A
--> Webservice legt Datei A in Ordner 1 ab
--> Wenn Datei vorhanden ist, wird Webservice mit dieser Datei aufgerufen
Webservice benötigt wieder etwa 15 Sekunden für die Erzeugung der Datei B aus Datei A
--> Webservice legt Datei B in Ordner 2 ab
--> Auslesen eines Wertes aus Datei B und Anzeige in der GUI
Ladebildschirm wird nicht mehr angezeigt, sondern nun die GUI mit dem eingetragenen Wert

Bevor der Wert in der GUI angezeigt werden kann, kommt das Timeout. Wenn ich aber in Ordner 2 schaue, ist dort Datei B vorhanden, aber erst (fast) genau in dem Moment, in dem das Timeout kommt.

Um genau zu sein, soll eigentlich sogar der Webservice mit Datei B nochmal aufgerufen werden (dauert dann wieder etwa 15 Sekunden, Datei B wird komplett eingelesen und Werte in eine Access-Datenbank geschrieben, die dann ausgelesen werden soll).

Es wird nicht immer wieder das selbe gemacht mit den jeweiligen Dateien. Der Webservice wird mit unterschiedlichen Parametern aufgerufen und alle 3 Aufrufe sind wirklich notwendig, daran kann ich nix ändern :rolleyes:

Wäre denn eine Lösung, das Timeout des Browsers zu verändern? Oder sollte ich den Browser igendwas anzeigen lassen, z.B. nachdem die Datei A erzeigt wurde?
 
Als erstes würde ich versuchen den Webservice zu optimieren.
Denn wenn ich über 30 Sekunden vor einem Browser sitze, würde ich davon ausgehen das da irgendetwas nicht richtig läuft und den Tab schließen.

Wie wäre es wenn du direkt einen Seiten wechsel machst und dann den Webservice mit einem Ajay Request anfragst (asynchron).
Dann kannst du eine Seite anzeigen mit dem Inhalt:"Daten werden geladen, dieser Vorgang wird einige Zeit in anspruch nehmen (ca. xx Sekunden)."
Sobald der Request beendet ist, kannst du die Ausgabe in die Seite einfügen.

Aber warte evtl erst noch ein paar Komentare von anderen Usern ab. Vielleicht hat ja noch jemand eine elegantere Idee.
 
Ja, ich denke auch, dass ein Seitenwechsel wohl das Beste wäre. Im Internet Explorer geht es auch so, wie es bisher läuft. Der hat anscheinend keinen Timeout.
Gestern wurde sowieso entschieden, dass alles ganz anders gemacht werden soll, wodurch diese lange Wartezeit wahrscheinlich eh wegfallen wird.
Trotzdem danke für eure Antworten!
 
Zurück