Serlvet 處理http請求並保持長串連

來源:互聯網
上載者:User

標籤:err   comm   int   並且   web   get   title   產生   訪問   

一.Servlet,一個請求在容器中是如何處理的

Servlet規定的,相應客戶請求訪問特定Servlet流程如下:

1.用戶端發出請求。

2.Servlet容器接收客戶請求解析。

3.Servlet容器建立一個ServletRequest對象。

其中包含客戶請求資訊及其他關於客戶的資訊如要求標頭,請求本文,客戶機的IP等。

4.容器建立一個ServletResponse對象。

5.容器調用客戶請求的Servlet的service方法,並且把ServletRequest和ServletResponse作為參數傳入。

6.Servlet從客戶參數中獲得客戶請求資訊,並調用對應的doGet或doPost處理。

7.Servlet利用ServletResponse對象來生產相應結果。

8.Servlet容器把Servlet產生的結果發給客戶。

二.Servlet3.0長串連

servlet3.0規範中添加了非同步處理,即一部分操作處理完成之後,先行把資料返回來,對於另一部分比較耗時的操作可以放置到另外一個線程中進行處理,該線程保留有串連的請求和響應對象,在處理完成之後可以把處理的結果通知到用戶端,執行個體代碼如下:

 

[java] view plain copy  print?
  1. import java.io.IOException;  
  2. import java.io.PrintWriter;  
  3. import java.util.Date;  
  4. import javax.servlet.AsyncContext;  
  5. import javax.servlet.AsyncEvent;  
  6. import javax.servlet.AsyncListener;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.annotation.WebServlet;  
  9. import javax.servlet.http.HttpServlet;  
  10. import javax.servlet.http.HttpServletRequest;  
  11. import javax.servlet.http.HttpServletResponse;  
  12. @WebServlet(urlPatterns="/demo", asyncSupported=true)  
  13. public class AsynServlet extends HttpServlet {  
  14.     private static final long serialVersionUID = -8016328059808092454L;  
  15.       
  16.     /* (non-Javadoc) 
  17.      * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) 
  18.      */  
  19.     @Override  
  20.     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {  
  21.             resp.setContentType("text/html;charset=UTF-8");  
  22.             PrintWriter out = resp.getWriter();  
  23.             out.println("進入Servlet的時間:" + new Date() + ".");  
  24.             out.flush();  
  25.   
  26.             //在子線程中執行業務調用,並由其負責輸出響應,主線程退出  
  27.             final AsyncContext ctx = req.startAsync();  
  28.             ctx.setTimeout(200000);  
  29.             new Work(ctx).start();  
  30.             out.println("結束Servlet的時間:" + new Date() + ".");  
  31.             out.flush();  
  32.     }  
  33. }  
  34.   
  35. class Work extends Thread{  
  36.     private AsyncContext context;  
  37.       
  38.     public Work(AsyncContext context){  
  39.         this.context = context;  
  40.     }  
  41.     @Override  
  42.     public void run() {  
  43.         try {  
  44.             Thread.sleep(2000);//讓線程休眠2s鐘類比逾時操作  
  45.             PrintWriter wirter = context.getResponse().getWriter();           
  46.             wirter.write("延遲輸出");  
  47.             wirter.flush();  
  48.             context.complete();  
  49.         } catch (InterruptedException e) {  
  50.               
  51.         } catch (IOException e) {  
  52.               
  53.         }  
  54.     }  
  55. }  

 

有些時候,我們可能需要用戶端和伺服器保持長串連的時候,我們可以使用這個特性,讓伺服器長時間保持用戶端的請求以及對用戶端的響應,做法如下:

對於非同步執行,我們可以添加一個監聽器,監聽非同步執行的狀態。

[java] view plain copy  print?
  1. ctx.addListener(new AsyncListener() {  
  2.     @Override  
  3.     public void onTimeout(AsyncEvent arg0) throws IOException {  
  4.         // TODO Auto-generated method stub                
  5.     }             
  6.     @Override  
  7.     public void onStartAsync(AsyncEvent arg0) throws IOException {  
  8.         // TODO Auto-generated method stub                
  9.     }             
  10.     @Override  
  11.     public void onError(AsyncEvent arg0) throws IOException {  
  12.         // TODO Auto-generated method stub  
  13.     }  
  14.     @Override  
  15.     public void onComplete(AsyncEvent arg0) throws IOException {  
  16.         // TODO Auto-generated method stub  
  17.     }  
  18. });  

在Servlet返回之前,我們可以把持有request和response對象的AsyncContext對象放置到一個全域可訪問的靜態容器中

map.put("id",ctx);

如果串連出錯或者串連完的時候我們可以在onError以及onComplete方法中移除掉對應串連的AsyncContext

map.remove("id",ctx);

在逾時的回調方法onTimeout中,我們可以往瀏覽器發送指定的資訊,讓用戶端重新發起請求,這樣就可以保持用戶端和伺服器的長久串連。

如下伺服器和用戶端之間資料互動的模型圖

Serlvet 處理http請求並保持長串連

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.