2011-11-04 15 views
17

O ile mi wiadomo, Java Servlets obsługują wiele żądań jednocześnie i przeszukałem StackOverflow, jak również Google, i potwierdziłem, co myślałem. Jednak jestem teraz bardzo zdezorientowany, napisałem proste serwlety, które wydają się blokować zachowanie.Serwlet wydaje się obsługiwać wiele jednoczesnych żądań przeglądarki synchronicznie

więc mam proste serwletu:

public class MyServlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 2628320200587071622L; 

    private static final Logger logger = Logger.getLogger(MyServlet.class); 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
     logger.info("[doGet] Test before"); 

     try { 
      Thread.sleep(60000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     logger.info("[doGet] Test after"); 

    resp.setContentType("text/plain"); 
    resp.getWriter().write("OK"); 

    } 
} 

Wtedy mam 2 okien przeglądarki, otworzyłem w ~ tym samym czasie, który dotknął mojego serwletu. Rezultatem jest pierwsza próba zablokowania drugiej. Dziennik zawiera również:

10:49:05,088 [http-8383-Processor14] INFO MyServlet - [doGet] Test before 
10:50:05,096 [http-8383-Processor14] INFO MyServlet - [doGet] Test after 
10:50:05,106 [http-8383-Processor22] INFO MyServlet - [doGet] Test before 
10:51:05,112 [http-8383-Processor22] INFO MyServlet - [doGet] Test after 

czuję jakbym czegoś brakuje ... Servlets powinien być w stanie obsługiwać jednoczesne żądanie, ale nie robi wydaje się to robić. Zrobiłem też to samo, co powyżej, w metodzie serwisowej zamiast w DoGet i robi to samo.

Jakieś wskazówki?

Dzięki

+1

Twoja przeglądarka może serializować żądania, co się stanie, jeśli spróbujesz tego z 2 różnych komputerów lub z 2 różnych przeglądarek? (tzn. iexploere i firefox) Możesz również sprawdzić dzienniki dostępu http, aby zobaczyć, czy żądania docierają do twojego kontenera serwletów jednocześnie. – rsp

+0

Czy możesz pokazać 'web.xml' i (zakładając, że jest to tomcat)' server.xml'. – beny23

+0

@beny: Nie jestem pewien, jak dokładnie byłoby to pomocne w zrozumieniu przyczyny problemu. Czy możesz rozwinąć? – BalusC

Odpowiedz

25

Twoja przeglądarka najwyraźniej używa tego samego połączenia HTTP w różnych oknach. Kontener serwletów używa pojedynczego wątku na połączenie HTTP, a nie na żądanie HTTP. Aby przetestować to poprawnie, powinieneś uruchomić dwie fizycznie różne przeglądarki. Na przykład. jeden Firefox i jeden Chrome.

+0

Co sprawia, że myślisz, że w tym miejscu używane jest połączenie pojedynczego wątku **? Te dwa żądania są przetwarzane przez różne wątki, czy nie może być tak, że zasada pojedynczego wątku-na-** ** jest faktycznie adoptowana przez serwer, podczas gdy po stronie klienta to samo połączenie TCP jest używane bez potokowania HTTP (tak w kolejce przez przeglądarkę)? To tłumaczyłoby sekwencyjne przetwarzanie pomimo różnych wątków związanych z –

+0

@BalusC: Zamiast zanieczyszczać ten wątek, rozważałem zrobienie osobnego wątku dla tego wątku. Proszę zobaczyć - http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti –

Powiązane problemy