Möglichkeit zum Timeout eines Process

Status
Nicht offen für weitere Antworten.

Einwegdose

Aktives Mitglied
Guten Tag !

Ich habe im Moment ein Problem mit unserem guten alten Freund dem BufferedReader :autsch:

Zum Situation:
Mit einem Process wird das Programm cURL (mit Parametern) aufgerufen, welches verschiedene GET/POST-Aufgaben erledigt. Über den Input und Error-Stream hole ich die Ausgabe (also Statusanzeige, ...) in mein Java-Programm.
Das klappt auch alles wunderbar über Threads. Das Problem besteht nun (wie bei Streams), wenn das Ende des InputStreams erreicht ist, daher das Programm keine Ausgabe mehr bringt. Der BufferedReader hängt sich dann bei readLine() auf, da kein \r bzw \n kommt ...

Leider weiss ich nun nicht wann diese letzte Zeile erreicht ist - deshalb wollte ich fragen ob es auch sowas wie ein Timeout bei einem Socket für einen Process gibt, oder jemand einen anderen Lösungsvorschlag hat (aber bitte keine ala 'Es gibt doch von Apache den HttpClient' oder sowas !) .. ansonsten weiss ich nicht, wie ich das Problem sicher lösen kann.

Danke schonmal :toll:
 

Murray

Top Contributor
Evtl. hilft Dir Process#waitFor weiter. Damit wird solange gewartet, bis der aufgerufene Prozess beendet wurde. Danach macht es wohl keinen Sinn mehr, auf Eingaben zu warten.
 

Einwegdose

Aktives Mitglied
Hmm ich glaube nicht dass das was hilft. Soweit ich weiss, hängt sich der Prog bei waitFor() solange auf, bis er fertig ist. Aber solange er nicht fertig ist, lese ich jede Sec den InputStream aus ... und das könnte ich ja dann nicht mehr machen ! Ich brauch ja die Ausgabe solange sie noch kommt ;)
 

Einwegdose

Aktives Mitglied
Hi!

Deine Idee ist nicht schlecht, aber (soweit ich es probiert habe) für diesen Zweck leider sinnlos.
Der Grund: Das Programm (cURL) gibt in nicht genau festgelegten Zeiträumen den Status aus. Diese Status-Zeile brauche ich dann komplett (sobald sie verfügbar ist) um sie dann jewals weiterzuverarbeiten.
Eine Zeile ist immer 78 Chars lang. Wenn ich nun Bytes einlese, sind zu dem Zeitpunkt höchst unwahrscheinlich genau n * 78 Bytes verfügbar .. aber soviele brauche ich immer ! Ansonsten habe ich unfertige Statuszeilen mit denen ich nichts anfangen kann.

Bei dem folgenden Beispiel versuche ich eine komplette Zeile einzulesen. Allerdings fehlen pro Durchlauf immer mehr Bytes, die dann auch nicht beim nächsten Durchlauf am Anfang stehen, sondern verloren sind ...

Code:
    while ( true ) {
     byte arr[] = new byte[78];
     err.read(arr);
     for ( byte b : arr ) {
      System.out.print((char)b);
     }
     System.out.println("\r\n");
     Thread.sleep(1000);
     if ( "erstmalegal".equals("") ) break;
    }

Dagegen steht ganz klar der Vorteil des BufferedReaders, mir immer eine ganze Zeile (genau soviel wieviel ich brauche) zurückzuliefern. Wenn die verarbeitet ist, hole ich die nächste, etc, etc. Eigentlich perfekt .. nur das sie am Ende hängenbleibt da kein CRLF kommt -.- .. Ich versuche da mal morgen noch was hinzubekommen , weiss allerdings bisher nicht wie :bahnhof:

Falls noch andere Vorschläge da sind, ich bin ganz Ohr :)

Gruss & gn8 ^^


Hmm mir ist gerade noch ne Idee gekommen, die allerdings depreciated wäre ..

Wenn ich den BufferedReader#readLine() befehl in einen extra Thread stecke, vorher noch die System#nanoTime abspeichere, und dann den Thread laufen lasse, könnte ich ihn ja dann zwangsweise abbrechen nach n Nanosekunden wenn er sich nicht schon von alle beendet hat ( ==> eine Zeile ausgelesen werden konnte). Für den Zwangsabbruch müsste ich dann aber wohl eine der als depreciated markierten Methoden Thread#stop oder Thread#destroy anwenden.

Was haltet ihr davon ? :D
 

Murray

Top Contributor
Einwegdose hat gesagt.:
Hmm ich glaube nicht dass das was hilft. Soweit ich weiss, hängt sich der Prog bei waitFor() solange auf, bis er fertig ist. Aber solange er nicht fertig ist, lese ich jede Sec den InputStream aus ... und das könnte ich ja dann nicht mehr machen ! Ich brauch ja die Ausgabe solange sie noch kommt ;)

Das ist schon klar; natürlich kommt man da nicht mehr mit einem Thread aus.

Also: Prozess starten, waitFor() in neuem Thread ausführen, Daten lesen, bis a) eine Zeile gelesen wurde oder b) der zweite Thread signalisiert, dass das Programm beendet worde ist.
 

Einwegdose

Aktives Mitglied
Ich habe es jetzt über einen weiteren Thread gelöst, der versucht immer neue readLines() auszulesen und diese dann in einem Vektor zu schreiben.
Von dem anderen Thread aus kann ich dann überprüfen, ob sich der Vektor vergrößert hat. Tut er dies innerhalb einer geraumen Zeit nicht mehr, wird davon ausgegangen dass der Prozess beendet ist.
 

Natorion

Bekanntes Mitglied
kannst du nit einfach beim programende von cURL manuell nen sysout mit CLRF machen? bzw irgendeinen speziellen string schicken damit dein programm erkennt, dass ende ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Einfachste Möglichkeit online zu speichern? Netzwerkprogrammierung 28
G einfach Möglichkeit um Web Services erstellen Netzwerkprogrammierung 5
T Möglichkeit über das Netzwerk eine Funktion zu starten? Netzwerkprogrammierung 2
M Einfachste Möglichkeit aus'm Applet Daten an Server senden Netzwerkprogrammierung 6
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
P Client Timeout auffangen Netzwerkprogrammierung 2
Iron Monkey Timeout von connect Netzwerkprogrammierung 4
S socket timeout clientseitig Netzwerkprogrammierung 2
MQue Inputstream Timeout Netzwerkprogrammierung 2
G Webserivce - Timeout in Axis - Unterschiede SO_Timeout. Netzwerkprogrammierung 3
G Timeout bei UNC-Pfaden Netzwerkprogrammierung 2
DEvent Socket und Timeout Netzwerkprogrammierung 3
T Timeout eines KSOAP-Calls Netzwerkprogrammierung 5
P Socket Timeout ? Netzwerkprogrammierung 4
M SocketError bei Aufruf eines SOAP-Servers Netzwerkprogrammierung 8
G seite nach posten eines html-forms laden Netzwerkprogrammierung 0
J Protokolle innerhalb eines Heimnetzwerks Netzwerkprogrammierung 6
V Kann man mit Hilfe eines Java-Programms den Zugriff auf bestimmte Internetseiten verhinden? Netzwerkprogrammierung 3
N Name eines Attributes aus einem festen String und einer Variablen generieren Netzwerkprogrammierung 5
X Response eines RESTful-Service mit JSON Netzwerkprogrammierung 8
F Neuer Json aus teilen eines vorhandenen Json Netzwerkprogrammierung 0
N Client Identifikation eines Servers Netzwerkprogrammierung 1
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
K Multiplayer eines Spiels Netzwerkprogrammierung 21
K Ansprechen eines Remote Druckers Netzwerkprogrammierung 2
L Erstellen eines Online Multiplayer Apps Netzwerkprogrammierung 10
eLogic Download eines Links Netzwerkprogrammierung 2
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
2 Schliessen eines Serversockets Netzwerkprogrammierung 2
Hindi93 Abbruch eines Programmes abfangen Netzwerkprogrammierung 8
1 SSH-Kommunikation - Ende eines Streams nicht erkenntlich Netzwerkprogrammierung 2
C Alle Computer eines Netzwerkes finden Netzwerkprogrammierung 32
N Senden eines Arrays Netzwerkprogrammierung 6
U Name eines Netzlaufwerks ermitteln Netzwerkprogrammierung 5
L Body eines http Request auslesen Netzwerkprogrammierung 2
K Ende eines HTTP Response/Request Netzwerkprogrammierung 6
aze Tcp Verkehr eines Applets simulieren Netzwerkprogrammierung 10
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3
M Socket Leistungsfähigkeit eines xSocketservers, wieviele Verbindungen max? Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
K TrafficClass eines UDP Pakets kommt beim Empfänger nicht an Netzwerkprogrammierung 5
musiKk Problem bei bidirektionaler Nutzung eines Socket Netzwerkprogrammierung 2
J Machbarkeit eines Bluetooth-Servers? Netzwerkprogrammierung 2
S Realisierung eines Netzwerkcodes für ein Strategiespiel Netzwerkprogrammierung 7
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Broadcast - senden eines Packetes an alle rechner im netz Netzwerkprogrammierung 15
P problem beim schließen eines Streams Netzwerkprogrammierung 6
K Mit Java-MailAPI dir Verfügbarkeit eines SMTP-Servers prüfen Netzwerkprogrammierung 4
J while-Schleife / Abbruchbed. beim Einlesen eines Streams Netzwerkprogrammierung 4
U Ende eines Inputstreams ermitteln Netzwerkprogrammierung 3
J Länge eines Streams Netzwerkprogrammierung 4
G Info eines Webseites kopieren Netzwerkprogrammierung 16
J Antwort eines Soaprequests parsen mittels org.apache.soap Netzwerkprogrammierung 2
T Erstellung eines Proxy Netzwerkprogrammierung 11
T Pfad eines Servlets rausfinden Netzwerkprogrammierung 2
O Einbinden eines java-servers Netzwerkprogrammierung 9
C Übergabe eines Datensatzes (Übergabestruktur) Netzwerkprogrammierung 12
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Problem mit der Ausgabe eines Strings an SocketOut Netzwerkprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben