免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
使用異步Servlet擴展AJAX應用程序
使用異步Servlet擴展AJAX應用程序
作者:Bahar Li… 文章來源:BEA dev2dev 點擊數(shù):271 更新時間:2006-6-2
【字體:

如果您有任何疑問,請到開發(fā)論壇上提問。

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

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

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

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

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

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

  清單1

import java.io.IOException;            import java.io.PrintWriter;            import java.util.Date;            import java.util.Stack;            import javax.servlet.ServletException;            import javax.servlet.http.HttpServletRequest;            import weblogic.servlet.FutureResponseServlet;            import weblogic.servlet.FutureServletResponse;            // An AsynchronousServlet that handles HTTP requests from a "separate" thread and            // not the execute thread used to invoke this servlet.            public class AsynchronousServerResponseServlet extends FutureResponseServlet {            private final Notifier notifier;            public AsynchronousServerResponseServlet() {            this.notifier = new Notifier();            this.notifier.start();            }            public void service(HttpServletRequest request, FutureServletResponse response)            throws IOException, ServletException {            // push this client‘s request to a buffer and return immediately.            // asynchronous processing occurs in the run method of the Notifier Thread            notifier.poll(request, response);            }            class Notifier extends Thread {            private static Stack clients = new Stack();            void poll (HttpServletRequest request, FutureServletResponse response) {            clients.push(new Client(request, response));            }            public void run() {            while (!clients.empty()) {            Client client = null;            try            {            client = (Client) clients.pop();            PrintWriter pw = client.response.getWriter();            for(int j = 0; j < 10; j++) {            pw.println("Time is:" + new Date() + "
"); pw.flush(); } pw.close(); } catch(Throwable t) { t.printStackTrace(); } finally { try { client.response.send(); } catch(IOException ioe) { ioe.printStackTrace(); } } } } } // inner class that holds on to the clients http request and response class Client { private HttpServletRequest request; private FutureServletResponse response; private Client(HttpServletRequest request, FutureServletResponse response) { this.request = request; this.response = response; } } }

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

  單個線程可管理多個客戶端連接!

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

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

  原文出處:http://wldj.sys-con.com/read/185307.htm

 作者簡介
Bahar Limaye 是The College Board的一名系統(tǒng)架構師。他在構建分布式面向?qū)ο笙到y(tǒng)方面具有廣泛的經(jīng)驗。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
面向 Java 開發(fā)人員的 Ajax: 使用 Jetty 和 Direct Web Rem...
ActiveMQ之Ajax調(diào)用
服務器推送技術 - ServerPush
Comet基于 HTTP 長連接的“服務器推”技術在Java Web實時系統(tǒng)開發(fā)中的應用
使用Jetty和DWR創(chuàng)建伸縮性Comet程序 - zhangwenjun8045 - J...
Ajax簡介
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服