自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

異步Servlet在AJAX程序中的應用

開發(fā) 后端
異步Servlet應用擴展AJAX應用程序是構(gòu)建于異步Servlet理念的基礎(chǔ)之上的一種范型,那么到底是什么含義呢?本文將向你介紹使用異步Servlet擴展AJAX應用程序。

異步Servlet擴展AJAX應用程序為什么實用呢,大家知道作為Web應用程序模型的AJAX的出現(xiàn)使服務(wù)器端的面貌發(fā)生了巨大的變化。用戶對著Web頁面填寫表單并單擊提交按鈕轉(zhuǎn)到下一個鏈接的典型Web使用模式現(xiàn)在正在轉(zhuǎn)變?yōu)楦冗M的客戶端JavaScript以及功能更豐富的用戶界面,只要對表單進行操作,比如單擊一個復選框、按下一個鍵或?qū)⑹髽艘频揭粋€選項卡上,該用戶界面就會不斷地與服務(wù)器交互。

異步Servlet也一直在考慮從客戶端傳輸?shù)椒?wù)器的數(shù)據(jù)量有多大的問題。從可用性的角度來看,用戶在一個薄客戶端瀏覽器上獲得了富用戶界面,無需安裝任何東西。但是,當在服務(wù)器端擴展這些應用程序時就要付出代價了。AJAX應用程序的典型容量規(guī)劃數(shù)可能會是標準Web應用程序的3到4倍。

構(gòu)建于異步Servlet理念的基礎(chǔ)之上的這種范型,有人可能會問:這對WebLogic Server有何影響?每個發(fā)送給WebLogic的HTTP請求都要使用一個執(zhí)行線程。根據(jù)AJAX編程的性質(zhì)以及許多短期的請求會以輪詢的形式不斷發(fā)送的情況,該行為模式可能造成大量客戶端請求不斷沖擊服務(wù)器的局面。多年來,WebLogic都將這一問題考慮在內(nèi),并構(gòu)建了一個相當棒的特性,即FutureResponseServlet。從版本6.1開始,該功能就允許開發(fā)人員提供真正異步的來自服務(wù)器的通知,而無需對事件進行客戶端輪訓并在服務(wù)器端使用執(zhí)行線程。在9.x之前,BEA還不急于公開該類。

如何在現(xiàn)實中利用該類呢?我們來看一個例子。假定業(yè)務(wù)需求是要構(gòu)建一個基于Web的應用程序,該應用程序以近乎實時的方式向服務(wù)器發(fā)送數(shù)據(jù)而無需刷新瀏覽器。這樣的應用程序可以向服務(wù)器提交一個需要花很長時間處理的請求,而仍然能夠接收到關(guān)于其狀態(tài)的異步事件并監(jiān)聽事件。從技術(shù)角度來看,這有許多實現(xiàn)方法。其中一種方法就是使用一個與Java Servlet通信的Java Applet來獲得異步信息。這是一種不錯的方法,但是對于用戶來說有些不太方便,因為他們必須下載一個JVM,還要下載一個Applet到瀏覽器。此外,還必須維護一個從客戶端到服務(wù)器的持久性套接字連接,以便接收異步消息。設(shè)想一下,如果有1000個用戶使用該Applet,那么就有1000個執(zhí)行線程幾乎是在空等著發(fā)送事件通知到客戶端。當然了,還有其它方法,比如從Applet或AJAX應用程序構(gòu)建輪詢機制來定期檢查新數(shù)據(jù)。而如果不經(jīng)常接收到數(shù)據(jù),那么輪詢就顯得無用了,而且還浪費了服務(wù)器資源,占用了執(zhí)行線程。反之,服務(wù)器可以定期輪詢,將事件傳播回客戶端,并維護套接字線程,而無需使用持久性執(zhí)行線程。這非常類似于Java NIO的運行方式。理想情況下,我們都希望構(gòu)建一個從服務(wù)器“異步”接收事件通知而無需在服務(wù)器端使用持久性執(zhí)行線程的應用程序,不管它是一個applet還是一個基于AJAX的薄Web應用程序。

異步Servlet特別的出現(xiàn)在這里面對此問題,其中一種解決方案是創(chuàng)建一個擴展FutureResponseServlet類的Servlet。瀏覽器建立了到FutureResponseServlet類的單一連接,并在另一個線程中將它自身注冊為一個監(jiān)聽程序。只要在服務(wù)器端接收到一個事件,線程就向客戶端通知該事件。服務(wù)器與客戶端保持異步,無需使用持久性執(zhí)行線程。該模型可擴展用于多個并發(fā)用戶的情況。

本文并不打算介紹如何構(gòu)建AJAX應用程序。這方面的文章已經(jīng)有很多了。本文的重點在于討論表示層(比如AJAX、Applet或者任何前端應用程序)的異步處理的重要性。清單1展示了一個例子。

  1. import java.io.IOException;   
  2. import java.io.PrintWriter;   
  3. import java.util.Date;   
  4. import java.util.Stack;    
  5. import javax.servlet.ServletException;   
  6. import javax.servlet.http.HttpServletRequest;    
  7. import weblogic.servlet.FutureResponseServlet;   
  8. import weblogic.servlet.FutureServletResponse;    
  9. // An AsynchronousServlet that handles HTTP requests from a "separate" thread and   
  10. // not the execute thread used to invoke this servlet.   
  11. public class AsynchronousServerResponseServlet extends FutureResponseServlet {    
  12.    
  13.  private final Notifier notifier;   
  14.    
  15.  public AsynchronousServerResponseServlet() {     
  16.   this.notifier = new Notifier();     
  17.   this.notifier.start();    
  18.  }     
  19.    
  20.  public void service(HttpServletRequest request, FutureServletResponse response) throws IOException,ServletException {  
  21.   // push this client's request to a buffer and return immediately.     
  22.   // asynchronous processing occurs in the run method of the Notifier Thread     
  23.   notifier.poll(request, response);    
  24.  }     
  25.    
  26.  class Notifier extends Thread {  
  27.   private static Stack clients = new Stack();  
  28.   void poll (HttpServletRequest request, FutureServletResponse response) {  
  29.    clients.push(new Client(request, response));     
  30.   }  
  31.     
  32.  public void run() {  
  33.   while (!clients.empty()) {   
  34.    Client client = null;   
  35.    try{    
  36. client = (Client) clients.pop();    
  37. PrintWriter pw = client.response.getWriter();    
  38. for(int j = 0; j < 10; j++) {     
  39.  pw.println("Time is:" + new Date() + "");     
  40.  pw.flush();  
  41. }    
  42. pw.close();   
  43.    }   
  44.    catch(Throwable t) {    
  45. t.printStackTrace();   
  46.    }   
  47.    finally {    
  48. try {    
  49.  client.response.send();     
  50. }   
  51. catch(IOException ioe) {    
  52.  ioe.printStackTrace();    
  53. }   
  54.    }   
  55.   }     
  56.  }    
  57. }    
  58.  
  59. // inner class that holds o-n to the clients http request and response    
  60. class Client {     
  61.  private HttpServletRequest request;     
  62.  private FutureServletResponse response;  
  63.  private Client(HttpServletRequest request, FutureServletResponse response) {  
  64.   this.request = request;  
  65.   this.response = response;     
  66.  }    
  67. }   
  68.    
  69.  

可以看出,該例子非常簡單。AsynchronousServerResponseServlet類擴展了FutureResponseServlet,并重寫了service方法。只使用一個線程(即Notifier類)來處理所有的客戶端連接響應。對于每個HTTP請求,Servlet向Notifier線程注冊套接字連接,然后返回。異步事件被交付給客戶端,而持久性套接字連接被維持。

單個線程可管理多個客戶端連接!run()方法可用于根據(jù)某種消息選擇條件回調(diào)事件到客戶端。該例子只執(zhí)行了一個服務(wù)器端的push操作,有些過分簡單了。線程池可被用于某些類型的事件處理。

異步Servlet的應用總而言之,在處理長期運行的任務(wù)時,F(xiàn)utureResponseServlet是一個好特性,它允許開發(fā)人員提高性能,在獨立的線程中處理響應,并將開銷降至***。在構(gòu)建異步Servlet應用程序時,該方法支持可伸縮性。
 

【編輯推薦】

  1. Servlet多線程的相關(guān)問題淺析
  2. Servlet容器之安全多線程問題
  3. JSP Servlet開發(fā)最初那點事
  4. Servlet的運行環(huán)境配置淺談
  5. Servlet頁面跳轉(zhuǎn)實現(xiàn)方法的區(qū)別
責任編輯:仲衡 來源: 中國IT實驗室
相關(guān)推薦

2009-07-06 18:24:56

Servlet實例

2009-07-09 10:03:40

Servlet應用Weblogic環(huán)境

2013-09-02 09:18:59

2009-08-21 10:43:19

FlyTcpFrame

2009-07-09 16:47:26

Servlet的Web

2009-07-08 13:19:25

Future Resp

2011-06-16 14:08:20

JSONAjax

2024-12-10 00:00:30

ServletTomcat異步

2024-05-11 07:13:33

C#Task編程

2009-09-22 12:22:54

ibmdwLotus

2013-12-25 10:08:42

ember.js異步處理

2009-07-01 13:54:41

Servlet和JSP

2009-07-09 09:46:55

session過期Ajax

2021-06-02 10:39:59

ServletWebFluxSpringMVC

2009-07-06 15:19:13

webwork ser

2009-07-06 15:41:14

JSP應用

2010-06-28 18:21:36

UML類圖設(shè)計

2023-12-07 08:22:58

Android應用

2009-01-16 13:17:16

AjaxASP.NET.NET

2009-02-27 16:57:51

AJAX判斷請求
點贊
收藏

51CTO技術(shù)棧公眾號