Ablauf bei Request

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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
 
S

SlaterB

Gast
> 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
 
M

maki

Gast
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.
 
G

Guest

Gast
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
 
M

maki

Gast
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Servlet Request.getAttribut returns null from JSP Select-Box Allgemeines EE 4
M URL Servlet Request getParameter Allgemeines EE 2
G Request zu richtiger App leiten Allgemeines EE 2
J Client Request vom Server aus. Allgemeines EE 2
A Servlet erkennt request Objekt nicht Allgemeines EE 8
E Performance-Problem beim ersten Request Allgemeines EE 4
K Read Request Body Allgemeines EE 4
G jeder request eigener Thread ? Allgemeines EE 4
R Ist es möglich die Request paramter auf "null" zu Allgemeines EE 3
D Objekt geht bei request verloren Allgemeines EE 9
G Http request bekommen parsen und response senden Allgemeines EE 1
M "Auto Client-Request" oder Server-Push oder Ajax – Allgemeines EE 2
N Servlet-Request abbrechen? Allgemeines EE 3
R Formulardaten mit request.getAttribute(name) Allgemeines EE 4
H request in JSP Seite ? Allgemeines EE 4
F Wie auf request.params mittels ${} zugreifen? Allgemeines EE 7
C JSF: request nach ausführung killen? Allgemeines EE 7
J init-Methode eines Servlet ausführen ohne vorherigen request Allgemeines EE 2
B Java-Client für eBaySOAP-API liefert HTTP(400) Bad Request Allgemeines EE 2
TRunKX Wie kriege ich die Auswahl in meinen Server Request? Allgemeines EE 7
S request.getParameter() holt NULL Allgemeines EE 4
K Request Problem Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben