# Servlet --> Berechnung --> Timeout vom Proxy oder IE!?



## Maik (5. Feb 2004)

*Folgende Ausgangssituation:*
Ich habe ein Servlet geschrieben, welches große Datenmengen aus einer Datenbank holt und daraus dann verschiedenste Werte berechnet. Nachdem alle Berechnungen ausgeführt sind werden die Ergebnisse in einem Report ausgegeben. Je nach Datenmenge dauert die Berechnung/SQL-Abfragen ca. 2- 20 min. 
Das Servlet wird über den Browser (IE 6.0) gestartet. Nach ca. 2min bricht der IE mit Fehlermeldung ab--> zero Request.

*Versuch das Problem zu lösen --> ohne Erfolg*
Und hier liegt das Problem, wenn eine Abfrage länger als 2min dauert bekommt man als Antwort diesen o.g. Fehler. Schlussfolgerung daraus, dass Timeout des Proxys hoch zu setzen --> leider ohne Erfolg. Abfragen kürzer als 2 min sind funktioniert alles wunderbar.

Ich weis nicht wo genau das Problem liegt, am IE oder am Proxy. Es muss doch irgendeine Lösung für dieses Problem geben !!?

MfG Maik


----------



## CoolHOur (11. Apr 2004)

Hi!

Mit dem TimeOut geht das voll in Ordnung. Du wirst es über den Timeout nie hinbekommen.
Folgendes Vorgehen, wäre richtig.
Im Servlet ein Thread abspalten, welches die BErechnung vornimmt. Das Servlet dem Client, die Nachricht zusenden, dass berechnet wird. Den Client alle ca. 5 s. eine Anfrage an das Servlet machen, ob der Thread schon am Ende ist, wenn ja, REsult zurückgeben.
Anders, wird es nie funktionieren und würde auch keinen Sinn machen. Bei den intervallartigen Abfragen, wäre auch ein Statusreport für den Client denkbar. Der Mensch muss auch sehen, das sich da was bewegt.

Gruß CoolHour
http://www.java-studio.de


----------



## Wyvern (18. Sep 2007)

Habe jetzt fast das selbe Problem. 
Der Tomcat muß nach einem Request aus ner großen (und elend langsamen) Datenbank Daten sammeln. Das kann mehrere Minuten dauern, und der Browser bekommt nen Fehler:
"Zero Sized Reply
Squid did not receive any data for this request. "

Wenn es nicht über den Browsertimeout geht, gibts dann irgendwo ein Beispiel, wie das mit dem Thread abspalten und dem Nachfragen des Client mit Struts funktioniert?


----------



## maki (18. Sep 2007)

Da wahrscheinlich mehrere Benutzer diesen Report starten können, wäre es sehr sinnvoll über sowas wie ein Batch Processing nachzudenken, schliesslich soll der Server ja nicht in die Knie gehen, nur weil 3 Leute einen Report starten.


----------



## Wyvern (18. Sep 2007)

Ja, auf das System sollen mehrere bis viele Leute zugreifen. Dieser Report ist zwar nicht einer der oft genutzten, aber hin und wieder wird er definitiv verwendet. 
Hast Du ein Beispiel, oder gibts ne Anleitung, wie ich das in Struts integrieren kann?


----------



## maki (18. Sep 2007)

> Hast Du ein Beispiel, oder gibts ne Anleitung, wie ich das in Struts integrieren kann?


Struts ist zuständig für das Frontend, was du brächtest wäre in der Logik Schicht untergebracht, sowas wie eine Queue mit Jobs die im Hintergrund läuft, die nacheinander abgearbeitet werden. 
Der User braucht eine Übersicht über die Queue, dass er weiss, wenn sein Job fertig ist. Dann muss er natürlich noch auf den fertigen Report zugreifen können.


----------



## Wyvern (18. Sep 2007)

Hmmm, ja. Das wäre das mit dem eigenen Thread, der losläuft, und parallel dazu vielleicht n Ladebildschirm auf dem Browser angezeigt wird. Dieser Ladebildschirm fragt alle 10 s oder so  irgend einen Status des Threads ab.
Aber wie genau funktioniert das? Da bin ich etwas aufgeschmissen. 

Weil es ist leider nicht praktikabel, dem User zu sagen "in 3 Min hast die Seite - mach derweil was anderes" Ich will den User nur zeigen: Es passiert was. Und der Browser sollt den Request eben nicht abbrechen.


----------



## maki (18. Sep 2007)

> Weil es ist leider nicht praktikabel, dem User zu sagen "in 3 Min hast die Seite - mach derweil was anderes" Ich will den User nur zeigen: Es passiert was. Und der Browser sollt den Request eben nicht abbrechen.


Nix für ungut, aber schon auf Mainframes hatte man das Problem, dass Reports manchmal Stundenlang brauchen um erstellt zu werden.

Es ist sicherlich nicht praktikabel den User 20 Minuten oder länger vor dem Bldschirm sitzen zu lassen nach dem Motto "Bis das Ding nicht fertig ist, kannst du nichts anderes machen.".

Was passiert denn, wenn 3 User gleichzeitig so einen Report erstellen wollen? Müssen die dann 3-60 Minuten auf den Bildschirm starren, ohne die Anwendung weiter benutzen zu können.
Was passiert, wenn der Browser geschlossen wird bevor der Report fertig ist, müssen sie ihn dann neu starten?

Du könntest ja eine Ansicht implementieren, in der die User sehen können, welcher Job gerade läuft, welcher als nächstes dran ist  und bei fertigen Jobs einen link zur erstellten Reportdatei.

Eine einfache Lösung hab ich nicht für dich parat, vielleicht fält jemand anderem noch etwas ein.


----------

