Servlets
-
Hallo Forum, folgendes Problem ich würde gerne eine Klassenvariable(int) in einem Servlet hochzählen(so weit noch kein problem) und zwar mit zwei Anfragen auf mein Servlet, dann die threads schlafen schicken und schließlich die zahlen Ausgeben. Normal dachte ich das alle Servlets Multithreads sind. Leider beantwortet der Container(Tomcat) die Anfragen nacheinander(1,2)! Erst wenn ich ein weiters vom ersten Servlet abgeleitet Servlet erzeuge verhält sich das ganze wie gewünscht(2,2)!! Kann mir das bitte mal jemand erklären ist das normales Verhalten oder kann ich in der web.xml dran drehen?? Wäre nett wenn jemand ne Antwort hätte!!! mario
-
Mir ist nicht ganz klar was du da machen willst. Kannst du dein Problem noch einmal etwas anders Beschreiben?
-
So hier mal das Servlet!! wenn ich von zwei Browserinstanzen Anfragen starte, auf das gleiche Servlet dann ist die Ausgabe:'Zaehler:1', und 'Zaehler:2' und die Anfragen werden nacheinander abgearbeitet. Ich will aber das 'Zaehler:2' in beiden Browserinstanzen steht!!! Nach meinem Verständniss vom Multithreads sollte das doch auch so sein!!!(Beide Threads werden gleichzeitig abgearbeitet) Es verhält sich aber nur so, wenn ich die Klasse Ableite und die Anfragen dann auf beide Servlets starte!!(auch zwei seperate 'url-mappings' in der web.xml)
public class Connector extends HttpServlet { private static int zaehler=0; /** Initializes the servlet. */ public void init(ServletConfig config) throws ServletException { super.init(config); } /** Destroys the servlet. */ public void destroy() { } /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { zaehler++; response.setContentType("text/html"); PrintWriter out = response.getWriter(); try{ Thread.sleep(50000); }catch(Exception e){ } out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println(" Zaehler: "+ zaehler); out.println("</body>"); out.println("</html>"); out.flush(); out.close(); errorOut=""; } /** Handles the HTTP <code>GET</code> method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** Returns a short description of the servlet. */ public String getServletInfo() { return "'this is the main-connector!'"; } }
-
Was schreist du eigentlich hier so rum? Wie soll denn die erste Instanz wissen, was in einem anderen Servlet-Context geschieht?
-
Also wenn ich eine Klasse von der anderen ableite?? Dann erbt diese doch auch die Klassenvariable oder? Naja ist eigentlich nicht das Problem, dass Problem ist das jede Servletinstanz nur einen Thread zu haben scheind. Woran liegt denn das???
Die Anfragen werden eindeutig nacheinander abgearbeitet! Ausserdem wieso schreie ich???
-
Noch mal im Bezug zum Servlet-Context gibt es hier einen Parameter, mit dem ich die 'Multithreadfähigkeit' meines Servlets erweitern bzw. einschränken kann??
-
Ich habe dein Servlet ausprobiert. Es funktioniert so wie du es Erwartest!
Ich habe zwei unterschiedliche Browser dafür benutzt. Gleichzeitig starte ich zwei Anfragen auf das gleiche Servlet. Dafür benutze ich zwei unterschiedliche Browser(IE und Mozilla). Schwups die Wups, beide zeigen die Ziffer 2!.Du hast vermutlich das Servlet zweimal aus dem gleichen Browser ausgeführt. Das bewirkt tatsächlich das das Servlet hintereinander aufgerufen wird, weil bei der ersten Anfrage eine Session erzeugt wird, und bei der zweiten Anfrage diese Session weiterverwendet wird.
gibt es hier einen Parameter, mit dem ich die 'Multithreadfähigkeit' meines Servlets erweitern bzw. einschränken kann??
lese:
Java Servlet Specification, v2.2
3.3.3.1 Multithreading Issuesund noch etwas:
http://www.catb.org/~esr/faqs/smart-questions.html
-
ja das war es echt!! oh man!!! danke noch mal!!! weißt du ein tool wie man browseranfragen simulieren kann?? so mit dem browser ist doch sehr hackelig! mar_
-
weißt du ein tool wie man browseranfragen simulieren kann??