2014-03-29 156 views
2

我很少嘗試一些HttpServlet的東西來更好地理解它。我想構建一個請求傳入的場景,我需要相應地儘快發送響應,並稍後再處理servlet中的一些工作。根據我目前的理解,只有在doGet或doPost方法返回時纔會將響應發送給客戶端。但是從我的例子來看,響應在servlet中的命令處理過程中已經發送回客戶端。所以它在我沒有預料到的時候已經回來了。Java - HttpServlet:什麼時候發送給客戶端?

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     try { 
      Thread.sleep(500); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex); 
     } 

     response.setContentType("text/plain; charset=ISO-8859-1"); 
     response.setStatus(HttpServletResponse.SC_FORBIDDEN); 
     final StringWriter sw = new StringWriter(); 
     PrintWriter out = new PrintWriter(sw); 
     //TODO most be implemented SynchronizedStatusCodeDimo 
     out.println("StatusCode=0"); 
     out.println("StatusText=Accepted"); 
     out.println("paymentType=PaymentXY"); 
     out = response.getWriter(); 
     out.print(sw.toString()); 
     out.flush(); 
     out.close(); 

     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(DisplayHeader.class.getName()).log(Level.SEVERE, null, ex); 
     } } 

這到底是怎麼發生的,通過螢火我看到,我已經收到了510ms後生成的響應。因爲睡覺,我覺得我需要1500ms以上的時間。我的理解是基於這個職位:Link

+2

這裏有什麼問題?該flush()刷新?或者關閉()關閉?爲什麼這樣的驚喜? – EJP

+0

成功回調request1後,我們能不能從客戶端發起請求2。並且請求2可以根據request1響應做進一步的處理。 –

+0

是的,也許根本沒有任何問題,我首先得到它只是錯誤,並期待在Servlet中完成所有事情之後的響應(所以當doGet/doPost被退回),而不是在這裏處理中。 – fryk9

回答

4

HttpServletResponse將由您的servlet容器(Tomcat,Jetty等)控制。

如果寫入response,servlet容器會在定義的緩衝區大小(例如9000字節之後的Tomcat)後自動刷新response。通常你可以配置它(在Tomcat中用參數socketBuffer)。 這是它的工作方式,如果你不自己控制它。

對於您的情況,您控制自己的回覆,並在您致電response.flush()後,回覆將發送給客戶。 如果你已經寫了更多的9000字節(在Tomcat中),響應將自動發送(在它的中間)。

(原諒我的英語不好)

+0

謝謝。但out.close()強制在我的示例中發送響應。當我刪除out.close()行並且只有out.flush()時,響應會在1500ms後發送,因此兩個休眠都會在響應發送之前處理。 – fryk9

+0

這是不正確的。在第一種情況下,答案會在約500ms後(在out.flush()之後)開始,並且在500ms之後也會結束,因爲您關閉了流。第二臺服務器在500ms後(在out.flush()之後)啓動響應,但響應在1500ms之後結束,因爲servlet容器在完成後關閉流。你應該在螢火蟲 – drkunibar

+0

中看到這個,我明白了,現在它完全有意義。謝謝。 – fryk9