2011-11-04 91 views
17

據我所知,Java Servlets同時處理多個請求,並且我通過StackOverflow和Google進行了搜索,並確認了我的想法。不過,我現在很困惑,我寫了一個簡單的servlet,似乎顯示阻止行爲。Servlet似乎同時處理多個併發的瀏覽器請求

所以我有一個簡單的Servlet:

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

    } 
} 

然後,我有2個瀏覽器窗口,我在那個打我的Servlet了〜同時打開。 結果是阻止第二個請求的第一個請求。日誌也顯示:

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 

我覺得我失去了一些東西......應該能夠處理併發請求的Servlet,但它似乎沒有那樣做。我也在服務方法而不是doGet上做了同樣的事情,它也做了同樣的事情。

任何指針?

謝謝

+1

您的瀏覽器可能會將請求序列化,如果您從2臺不同的計算機或2種不同的瀏覽器嘗試此操作,會發生什麼情況? (即iexploere和firefox)您還可以檢查http訪問日誌,以查看請求是否同時到達您的servlet容器。 – rsp

+0

你可以顯示'web.xml'和(假設這是tomcat)'server.xml'。 – beny23

+0

@beny:我不確定這將有助於理解問題的原因。你能詳細說明嗎? – BalusC

回答

25

您的瀏覽器顯然是在不同的窗口中使用相同的HTTP連接。 servlet容器每個HTTP連接使用一個線程,而不是每個HTTP請求。你應該運行兩個物理上不同的瀏覽器來正確地測試它。例如。一個Firefox和一個Chrome。

+0

是什麼讓你認爲在這裏使用了單線程 - 每個**連接**?這兩個請求是由不同的線程處理的,不可能是服務器實際採用單線程每請求**策略,而在客戶端則使用相同的TCP連接而沒有HTTP流水線所以排隊瀏覽器)?這將解釋儘管涉及不同線程的順序處理 –

+0

@BalusC:與其污染此線程,我考慮爲此提出單獨的線程。請參閱 - http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti –

相關問題