ich lese von einer URL ein kleines Textfile (ca 10kb) ueber new URL(url).openConnection(). Manchmal kommt es vor, dass dieser prozess anscheinend nie endet, das File kommt niemals lokal an, der Prozess bricht auch nicht ab (was ich erstmals bei einem Timeout erwartet haette).
Kann es sein, dass es irgendwas gibt, was die connection valide offen laesst, und das file scheinbar nie zu ende liest ?! (also der stream niemals -1) returned ?
ich glaube hier ist eher der code wichtig der NACH deinem URL.openConnection() kommt
soweit mir bekannt sendet openConnection() lediglich den request an den server, das lesen muss man aber immer noch selbst übernehmen, oder nutzt du ein bestimmtes framework ? und woran machst du es fest das es genau diese zeile ist die niemals returned ? debug? sysouts?
alles in allem bissl wenig code und ein etwas zu allgemeines problem
ist es dir denn schon mal mit deinem normalen browser passiert das dieser “immer weiter lief” ohne timeout ? und hast du selbst schon mal versucht ein timeout zu setzen ?
ist leider mal wieder so ne frage für deren beantwortung einfach zu wenig infos vorliegen
der stream wird an snakeyaml weitergeleitet, der das yaml file liest. Da gibts nicht viel mehr code als
InputStream stream = new URL(url).openConnection();
Yaml yaml = yaml.load(stream);
Und ja, es kommen log infos nach diesem laden und die werden nicht ausgegeben.
Wie gesagt, das ganze tritt nicht regelmaessig auf, bei einem nicht erreichen der URL haette ich ein ConnectionTimeout erwartet.
Aber natuerlich bin ich mir nicht komplett sicher, dass diese Zeile bzw Statement das Problem ist, daher meine Frage, ob es ueberhaupt moeglich ist, dass eine connection ueber Tage offen bleibt und nicht endet
Aber natuerlich bin ich mir nicht komplett sicher, dass diese Zeile bzw Statement das Problem ist, daher meine Frage, ob es ueberhaupt moeglich ist, dass eine connection ueber Tage offen bleibt und nicht endet
Theoretisch ist das möglich, sofern es nicht irgendwelche Systeme gibt, die Timeouts definiert haben (Client, Server, Firewalls etc.).
Ob eine Connection tatsächlich (so lange) offen ist, kannst Du mittels des Befehls netstat prüfen.
Ein Lösungsansatz für Dich könnte sein, clientseitig in Deinem Programm Werte für Timeouts zu definieren:
con.setReadTimeout(<readTimeout>);```
Und zu guter Letzt noch die Standardfrage, wenn ein System scheinbar unendlich läuft und scheinbar nix macht: "Hast Du evtl. irgendwo Exceptions verschluckt, ohne sie zu loggen oder wenigstens ein printStackTrace zu machen?"
du könntest, um zu prüfen ob es am openConnection() oder am load() liegt noch sowas bauen
ByteArrayOutputStream baos=new ByteArrayOutputStream();
byte[] buffer=new byte[0x10000];
int i=0;
while((i=in.read(buffer))!=-1)
{
baos.write(buffer, 0, i);
}
in.close();
boas.close();
yaml.load(new ByteArrayInputStream(baos.toByteArray()));```
und zwischen jede zeile z.b. ein log oder sysout
damit kannst du dann ganz klar prüfen woran es hängt (wenns dann mal wieder hängt)
Mich wundert, wie du per “openConnection()” überhaupt einen Stream zurückbekommst. “openConnection()” gibt nur eine protokollabhängige Instanz einer URLConnection zurück und das ungeblockt. “openStream()” hingegen könnte jedoch schon geblockt werden, z.B. beim FILE- oder JAR-Protokoll, wenn die dazugehörigen Dateien bereits geöffnet sind bzw eine vorhergehende Connection auf solche Dateien zwar geöffnet aber nicht wieder geschlossen wurde.