# Ablauf bei Request



## Guest (6. Nov 2007)

Ich hätte da mal ein par allgemeine Fragen, was passiert wenn ich eine JSP Seite oder ein Servlet aufrufe.
Also das Servlet wird beim Starten des Servers instanziert und läuft dann dauernd, oder?

Wenn nun eine Anfrage kommt, wird die jeweilige Methode post,get.. aufgerufen. Wenn nun mehrere Anfragen paralell kommen, laufen diese dann in verschiedenen Threads des selben Objektes oder werden mehrere Objekte des Servlets instanziert?

Was passiert eigentlich wenn das Servlet eine lange Ausführungszeit hat, (zb es ließt aus einer datenbank) und ich breche sende den Request erneut? Wird der alte dann abgebrochen oder läuft der bis zu Ende weiter?

Könnte ich theoretisch beim zweiten Aufruf erkennen, dass der erste noch läuft und diesen Abbrechen? Mit in enem zentralen session manager die einzelnen Threads merken und sie bei bedarf abbrechen, ist sowas möglich?

Danke für die Infos


----------



## SlaterB (6. Nov 2007)

> Also das Servlet wird beim Starten des Servers instanziert und läuft dann dauernd, oder? 


das ist ja nur ein Objekt, kein Thread,
das ist dauernd da, läuft aber nicht dauernd

> laufen diese dann in verschiedenen Threads des selben Objektes oder werden mehrere Objekte des Servlets instanziert? 

du meinst 'verwenden mehrere Threads das gleiche oder unterschiedliche Servlet-Objekte'
dies sollte theoretisch in Einstellungen einstellbar sein,
hängt natürlich extrem davon ab, welchen Server du überhaupt verwendest 

ich persönlich gehe immer davon aus, dass ein Servlet-Objekt wiederverwendet wird,
also keine Exemplarvariablen setzen oder ähnlich komisches,
lieber ein DatenContainer-Objekt als Parameter überall durchreichen

> Wird der alte dann abgebrochen oder läuft der bis zu Ende weiter? 

das kann ich persönlich nciht sagen, aber eine Vermutung abgeben:
der Browser sendet eine Abbruch-Nachricht,
entweder ganz unverbindlich, oder ist so ein Request nicht gar eine TCP-Verbindung die beendet wird?
ach, ich weiß da grad von nix 

der Server sollte davon jedenfalls mitbekommen, wie man es bei Java nutzen kann weiß ich auch nicht

> Könnte ich theoretisch beim zweiten Aufruf erkennen, dass der erste noch läuft und diesen Abbrechen?

das kann man mit genügend Aufwand natürlcih checken,
besser wäre aber, direkt vom Abbruch zu erfahren und auch dann aufzuhören,
wenn kein zweiter Request kommt


----------



## maki (6. Nov 2007)

> Wenn nun eine Anfrage kommt, wird die jeweilige Methode post,get.. aufgerufen. Wenn nun mehrere Anfragen paralell kommen, laufen diese dann in verschiedenen Threads des selben Objektes oder werden mehrere Objekte des Servlets instanziert?


Mehrere Threads laufen durch ein Servlet, so sollte es sein.
Ausser jemand war verwirrt genug um das STM einzusetzen...



> Was passiert eigentlich wenn das Servlet eine lange Ausführungszeit hat, (zb es ließt aus einer datenbank) und ich breche sende den Request erneut?


Abbrechen wird wohl nicht gehen  Beide würden parallel laufen.



> Könnte ich theoretisch beim zweiten Aufruf erkennen, dass der erste noch läuft und diesen Abbrechen?


Schwierig.
Besser ist es, zu unterbinden das ein zweiter abgesetzt werden kann, zB. durch die Benutzung von Tokens.
Fall eine Verarbeitung lange dauert (Minuten bis Stunden), brauchst du sowas wie eine Queue die die Aufträge im Hintergrund bearbeitet, so kann der User im Vordergrund weiterarbeiten und bekommt keinen Timeout.


----------



## Guest (6. Nov 2007)

danke für die antworten. also der server ist ein tomcat.

also wenn die request dann wirklich paralell laufen, wäre eine Queue  oder ein Token system wirklich nicht schlecht.

Also konkret haben wir hier ein Auswertungssystem, dass von sehr vielen Benutzer am Ende des Monats benutzt wird. Die Auswertungen sind sehr rechen- und speicherintensiv. Die Anfrage kann schon mal eine Minute dauern. Leider haben wir das Problem, dass manche Benutzer, dann so schlau sind und die Seite 5-10 mal aufrufen, in der Hoffnung, dass es dann schneller geht. 10 Auswertungen parallel sind kein Problem, aber bei so über 100 bekommen wir outofMemory exceptions.  :autsch:



also mal dem Server mehr Speicher geben
den Benutzer clientseitig darauf hinweisen, das er die Anfrage nur einmal absetzen soll
serverseitig in der session checken ob gerade anfragen aktiv sind und nicht im jeden preis neu Abfragen absetzen

mal schaun ob es was hilft


----------



## maki (6. Nov 2007)

> Die Anfrage kann schon mal eine Minute dauern. Leider haben wir das Problem, dass manche Benutzer, dann so schlau sind und die Seite 5-10 mal aufrufen, in der Hoffnung, dass es dann schneller geht. 10 Auswertungen parallel sind kein Problem, aber bei so über 100 bekommen wir outofMemory exceptions. autsch.gif


Eine Queue wäre wirklich nicht verkehrt in diesem Fall, da würde dann zB. nur eine einzige Verarbeitung gleichzeitig laufen.
Die User könnten zB. über eine email informiert werden, wenn die Verarbeitung ihres Requests fertig ist, oder sich in einer Art übersicht über den Status informieren/ergebnisse ansehen.



> den Benutzer clientseitig darauf hinweisen, das er die Anfrage nur einmal absetzen soll


Du setzt zu jeder Form ein eindeutiges Token, wenn der Request abgeschickt ist, wird das Token ungültig gesetzt. Jeder weitere Request mit dem selben Token wid nicht bearbeitet, sondern ein Fehler wird angezeigt.
Es gibt mehrere Frameworks die so etwas "out of the box" bieten, zB. struts. Ist aber nicht schwer selbst zu implemetieren.


----------

