2013-07-07 97 views
-1

所以我認爲我的servlet可以在我的網頁與服務器通信的同時(同時)通過GET和POST處理請求。這可能是因爲這兩個請求是相同的頁面,所以只有一個線程處理這兩個請求。發生了什麼是我有一個POST請求通過JQuery AJAX請求調用,並在請求成功時調用具有JQuery AJAX GET請求的回調JavaScript方法。我的理解可能是錯誤的,什麼是成功的要求。任何建議或解釋我如何得到這個工作或爲什麼它不會工作,將不勝感激。Java servlet無法同時處理get和post請求

+0

你是如何確認的要求並沒有被同時處理?無論如何,你曾經觀察到的任何「同步」效果大部分都是模擬的:除了在多核機器上 - 所有線程都是循環處理的(具有輕微變化的平臺到平臺) – kolossus

+0

我會在get/post處理程序進入並離開處理程序之間添加一些人爲的睡眠,以確認實際情況。 –

+0

@kolossus我不需要他們必須是同時的,但我的POST方法似乎阻止,直到它完成。我會嘗試在我的問題中添加更多的上下文以使問題更清楚。 –

回答

1

我使用glassfish4,servlet的API 3測試你的情況,我觀察到以下幾點:

首先,我創建了一個用於GET和POST的servlet。這個servlet有5秒線程睡眠延遲

@WebServlet("/hello") 
public class HelloServlet extends HttpServlet { 

    private static final long serialVersionUID = 1L; 
    private static Logger logger = Logger.getLogger(HelloServlet.class); 

    public HelloServlet() { 
    super(); 
    logger.debug("HelloServlet created"); 
    } 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    logger.debug("get start"); 
    try { Thread.sleep(5000); } 
    catch (InterruptedException e) { e.printStackTrace(); } 
    logger.debug("get finish"); 
    super.doGet(req, resp); 
    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    logger.debug("post start"); 
    try { Thread.sleep(5000); } 
    catch (InterruptedException e) { e.printStackTrace(); } 
    logger.debug("post finish"); 
    super.doPost(req, resp); 
    } 

} 

我又試圖調用都5秒窗口中GET和POST,這就是它看起來像

INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:21 - HelloServlet created 
INFO: 2013-07-07 14:06:06 DEBUG HelloServlet:27 - get start 
INFO: 2013-07-07 14:06:08 DEBUG HelloServlet:41 - post start 
INFO: 2013-07-07 14:06:11 DEBUG HelloServlet:34 - get finish 
INFO: 2013-07-07 14:06:13 DEBUG HelloServlet:48 - post finish 
  • HelloServlet的只有1個實例這似乎是由 所有http工作線程共享
  • get和post請求都由不同的線程提供服務,調用get和post方法不同步

所以你原來的理解似乎是正確