成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Future Response Servlet特性

開(kāi)發(fā) 后端
本文介紹Future Response Servlet特性,以及重點(diǎn)在于討論表示層的異步處理的重要性。

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

考慮一下從客戶(hù)端傳輸?shù)椒?wù)器的數(shù)據(jù)量有多大。從可用性的角度來(lái)看,用戶(hù)在一個(gè)薄客戶(hù)端瀏覽器上獲得了富用戶(hù)界面,無(wú)需安裝任何東西。但是,當(dāng)在服務(wù)器端擴(kuò)展這些應(yīng)用程序時(shí)就要付出代價(jià)了。AJAX應(yīng)用程序的典型容量規(guī)劃數(shù)可能會(huì)是標(biāo)準(zhǔn)Web應(yīng)用程序的3到4倍。

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

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

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

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

  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.  
  12. public class AsynchronousServerResponseServlet extends 
    FutureResponseServlet {  
  13. private final Notifier notifier;  
  14. public AsynchronousServerResponseServlet() {  
  15. this.notifier = new Notifier();  
  16. this.notifier.start();  
  17. }  
  18. public void service(HttpServletRequest request, 
    FutureServletResponse response)  
  19. throws IOException,ServletException {  
  20. // push this client's request to a buffer and return immediately.  
  21. // asynchronous processing occurs in the run method of the Notifier Thread  
  22.  
  23. notifier.poll(request, response);  
  24. }  
  25. class Notifier extends Thread {  
  26. private static Stack clients = new Stack();  
  27. void poll (HttpServletRequest request, FutureServletResponse response) {  
  28. clients.push(new Client(request, response));  
  29. }  
  30. public void run() {  
  31. while (!clients.empty()) {  
  32. Client client = null;  
  33. try{  
  34. client = (Client) clients.pop();  
  35. PrintWriter pw = client.response.getWriter();  
  36. for(int j = 0; j < 10; j++) {  
  37. pw.println("Time is:" + new Date() + "");  
  38. pw.flush();  
  39. }  
  40. pw.close();  
  41. }  
  42. catch(Throwable t) {  
  43. t.printStackTrace();  
  44. }  
  45. finally {  
  46. try {  
  47. client.response.send();  
  48. }  
  49. catch(IOException ioe) {  
  50. ioe.printStackTrace();  
  51. }  
  52. }  
  53. }  
  54. }  
  55. }  
  56. // inner class that holds o-n to the clients http request and response  
  57.  
  58. class Client {  
  59. private HttpServletRequest request;  
  60. private FutureServletResponse response;  
  61. private Client(HttpServletRequest request, FutureServletResponse response) {  
  62. this.request = request;  
  63. this.response = response;  
  64. }  

可以看出,該例子非常簡(jiǎn)單。AsynchronousServerResponseServlet類(lèi)擴(kuò)展了Future Response Servlet,并重寫(xiě)了service方法。只使用一個(gè)線(xiàn)程(即Notifier類(lèi))來(lái)處理所有的客戶(hù)端連接響應(yīng)。對(duì)于每個(gè)HTTP請(qǐng)求,servlet向Notifier線(xiàn)程注冊(cè)套接字連接,然后返回。異步事件被交付給客戶(hù)端,而持久性套接字連接被維持。

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

總而言之,在處理長(zhǎng)期運(yùn)行的任務(wù)時(shí),F(xiàn)uture Response Servlet是一個(gè)好特性,它允許開(kāi)發(fā)人員提高性能,在獨(dú)立的線(xiàn)程中處理響應(yīng),并將開(kāi)銷(xiāo)降至最低。在構(gòu)建異步應(yīng)用程序時(shí),該方法支持可伸縮性

【編輯推薦】

  1. Struts和JSP頁(yè)面的技術(shù)
  2. 詳解JSP向Servlet轉(zhuǎn)換
  3. Servlet2.5版本的特征淺析
  4. 淺談Servlet/JSP服務(wù)器端的重定向
  5. Ajax Servlet實(shí)例在網(wǎng)絡(luò)編程的應(yīng)用
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

2009-07-08 13:19:25

Future Resp

2013-09-02 09:18:59

2009-07-08 09:35:53

Java ServleServlet 3.0

2009-07-09 10:49:56

Servlet和JSP

2010-04-30 09:19:05

Servlet 3.0

2010-01-14 09:15:07

Java EE 6Servlet 3.0異步處理

2023-04-23 08:49:17

Java接口Future

2009-07-06 14:05:50

Servlet編程Servlet顯示圖片

2017-06-15 13:29:12

AkkaSpark異步

2009-07-09 11:27:59

Servlet容器

2009-07-09 15:05:45

Servlet實(shí)例

2009-07-03 10:31:57

什么是ServletServlet API

2011-11-18 10:50:25

設(shè)計(jì)模式Java線(xiàn)程

2013-02-26 09:23:16

JavaJava類(lèi)接口

2020-08-18 10:20:50

Java 編程開(kāi)發(fā)

2010-03-05 10:47:05

Python futu

2022-08-31 08:48:51

ARXRMetaverse

2009-07-08 15:01:00

Servlet Ses

2009-07-08 17:04:25

user cache

2009-07-09 13:39:52

Servlet Con
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 欧美一级淫片免费视频黄 | 免费在线看黄 | 欧美久久国产精品 | h片在线看| 18性欧美| 午夜爽爽爽男女免费观看影院 | 久久成人一区 | 亚洲乱码国产乱码精品精98午夜 | 国产精品一区二区视频 | 99re6在线视频精品免费 | 日韩中文一区 | 日本精品一区二区 | 91在线视频免费观看 | 毛片综合| 九九导航 | 国产一区欧美一区 | 久久久久免费精品国产小说色大师 | 亚洲欧美精品在线观看 | 成人免费视频网站在线看 | 青青激情网 | av天天干 | 欧美成人一区二区三区 | 波多野结衣二区 | 亚洲乱码一区二区三区在线观看 | 亚洲精品久久国产高清情趣图文 | 97人人超碰 | 国产亚洲人成a在线v网站 | 欧美亚洲国产日韩 | 亚洲成av片人久久久 | 日产精品久久久一区二区福利 | 成人精品一区二区户外勾搭野战 | 中文字幕在线二区 | 九九精品在线 | 久久久久久色 | 亚洲国产精品久久久久秋霞不卡 | 国产成人网 | 国产精品久久久久久模特 | 91大神在线资源观看无广告 | 免费黄色录像视频 | 久久久这里都是精品 | 国产日韩欧美在线观看 |