Servlet Threadsave

bronks

Top Contributor
Hi!

Auf meinem Tomcat 5.5 passieren gerade seltsame Sachen, welche ich nicht nachvollziehen kann.

Mal angenommen, ich bin als root angemeldet und rufe das u.g. Servlet mit GET auf und ein paar weitere User mit GET und POST zur gleichen Zeit.

Ist es sicher, daß ich "root" als response erhalte?

Ist es möglich, daß sich die Requests in die Quere kommen und im Response etwas anderes, als ihren Benutzernamen erhalten?

Danke!

Bronks

Java:
public class ThreadSave extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String u = request.getRemoteUser();

        try {
            //Hier werden ein paar Sachen erledigt, welche evtl. 0.5 Sekunden brauchen.

            out.println(u);
        } catch (Exception e) {
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}
 
Zuletzt bearbeitet:

jwiesmann

Bekanntes Mitglied
Ist es sicher, daß ich "root" als response erhalte? JA

Ist es möglich, daß sich die Requests in die Quere kommen und im Response etwas anderes, als ihren Benutzernamen erhalten? Nein

Wenn dein
Code:
String u
jedoch irgendwo im Servlet selbst als Variable deklariert ist, kann es ggf. zu den o.g. Fehlern kommen

Java:
public class ThreadSave extends HttpServlet {
  String u; // dont do that!
}
 

bronks

Top Contributor
Danke für die Bestätigung! :) Dann glaube ich wieder an die Technik und mein Problem liegt irgendwo anders begraben ...

Wenn ich in o.g. Code den Kommentar gegen ein "Thread.sleep(15000);" ersetzte und 20 Request abfeuere, dann passiert erstmal 15 Sekunden nichts und danach werden 20 Responses abgeschickt.
- Da die MemberVariables ihren Zustand dauerhaft behalten, scheint es zu stimmen, daß es nur eine Instanz des Servlets gibt. Richtig?
- Was für eine Technik steckt dahinter, daß die ServiceMethods des Servlets trotzdem parallel nebeneinander mehrere Requests verarbeiten können.
 
M

maki

Gast
- Da die MemberVariables ihren Zustand dauerhaft behalten, scheint es zu stimmen, daß es nur eine Instanz des Servlets gibt. Richtig?
Ja, es gibt im Normalfall nur eine Instanz des Servelts (Pro Container), d.h. alle Threads teilen sich die Instanzvariablen -> nicht Trheadsicher

Was für eine Technik steckt dahinter, daß die ServiceMethods des Servlets trotzdem parallel nebeneinander mehrere Requests verarbeiten können.
Ganz einfach: Servlets sind nicht Threadsicher, der Container lässt die Requests (Threads) gleichzeitig drauf los.
Container Poolen die Threads, d.h. es gibt zB. nur 5 Threads, die reichen aber um 20 Request abzuarbeiten, es werden eben nur 5 gleichzeitig an die "Arbeit gelassen".
 

Neue Themen


Oben