2011-11-04 28 views
17

Theo tôi biết Java Servlets đang xử lý nhiều yêu cầu đồng thời và tôi đã tìm kiếm qua StackOverflow cũng như Google và xác nhận những gì tôi nghĩ. Tuy nhiên tôi khá bối rối ngay bây giờ, tôi đã viết một servlet đơn giản dường như thể hiện hành vi chặn.Servlet dường như xử lý nhiều yêu cầu trình duyệt đồng thời

vì vậy tôi có một Servlet đơn giản:

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"); 

    } 
} 

Sau đó, tôi có 2 cửa sổ trình duyệt, tôi mở tại ~ cùng thời điểm đó nhấn Servlet của tôi. Và kết quả là yêu cầu đầu tiên chặn yêu cầu thứ hai. Nhật ký cũng hiển thị:

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 

Tôi cảm thấy mình thiếu thứ gì đó ... Servlets có khả năng xử lý yêu cầu đồng thời, nhưng dường như nó không hoạt động. Tôi cũng đã làm tương tự như trên phương pháp dịch vụ thay vì doGet và nó làm điều tương tự.

Mọi con trỏ?

Cảm ơn

+1

Trình duyệt của bạn có thể nối tiếp các yêu cầu, điều gì sẽ xảy ra nếu bạn thử điều này từ 2 máy tính khác nhau hoặc với 2 trình duyệt khác nhau? (ví dụ: iexploere và firefox) Bạn cũng có thể kiểm tra nhật ký truy cập http để xem liệu các yêu cầu có đồng thời đến thùng chứa servlet của bạn hay không. – rsp

+0

Bạn có thể hiển thị 'web.xml' và (giả định đây là tomcat)' server.xml' không. – beny23

+0

@beny: Tôi không chắc chính xác điều đó sẽ hữu ích như thế nào trong việc hiểu nguyên nhân của vấn đề. Bạn có thể xây dựng? – BalusC

Trả lời

25

Trình duyệt của bạn dường như đang sử dụng cùng kết nối HTTP trong các cửa sổ khác nhau. Thùng chứa servlet sử dụng một luồng duy nhất cho mỗi kết nối HTTP, không phải theo yêu cầu HTTP. Bạn nên chạy hai trình duyệt web khác nhau để kiểm tra điều này đúng cách. Ví dụ. một Firefox và một Chrome.

+0

Điều gì khiến bạn nghĩ rằng một kết nối đơn-mỗi-** ** đang được sử dụng ở đây? Hai yêu cầu được xử lý bởi các luồng khác nhau, không thể là chính sách một yêu cầu đơn lẻ ** được thực thi bởi máy chủ, trong khi ở phía máy khách, cùng một kết nối TCP đang được sử dụng mà không cần HTTP pipelining (được xếp hàng đợi bởi trình duyệt)? Điều này sẽ giải thích việc xử lý tuần tự bất chấp các chủ đề khác nhau liên quan đến –

+0

@BalusC: Thay vì gây ô nhiễm chủ đề này, tôi đã xem xét việc tạo ra một chuỗi riêng biệt cho điều này. Vui lòng xem - http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti –

Các vấn đề liên quan