千家信息网

如何扩展Future Response Servlet

发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,本篇内容介绍了"如何扩展Future Response Servlet"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读
千家信息网最后更新 2024年09月24日如何扩展Future Response Servlet

本篇内容介绍了"如何扩展Future Response Servlet"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

作为Web应用程序模型的AJAX的出现使服务器端的面貌发生了巨大的变化。用户对着Web页面填写表单并单击提交按钮转到下一个链接的典型Web使用模式现在正在转变为更先进的客户端JavaScript以及功能更丰富的用户界面,只要对表单进行操作,比如单击一个复选框、按下一个键或将鼠标移到一个选项卡上,该用户界面就会不断地与服务器交互。

考虑一下从客户端传输到服务器的数据量有多大。从可用性的角度来看,用户在一个薄客户端浏览器上获得了富用户界面,无需安装任何东西。但是,当在服务器端扩展这些应用程序时就要付出代价了。AJAX应用程序的典型容量规划数可能会是标准Web应用程序的3到4倍。

有人可能会问:这对WebLogic Server有何影响?每个发送给WebLogic的HTTP请求都要使用一个执行线程。根据AJAX编程的性质以及许多短期的请求会以轮询的形式不断发送的情况,该行为模式可能造成大量客户端请求不断冲击服务器的局面。多年来,WebLogic都将这一问题考虑在内,并构建了一个相当棒的特性,即 Future Response Servlet。该范型构建于异步servlet理念的基础之上。从版本6.1开始,该功能就允许开发人员提供真正异步的来自服务器的通知,而无需对事件进行客户端轮训并在服务器端使用执行线程。在9.x之前,BEA还不急于公开该类。

如何在现实中利用该类呢?我们来看一个例子。假定业务需求是要构建一个基于Web的应用程序,该应用程序以近乎实时的方式向服务器发送数据而无需刷新浏览器。这样的应用程序可以向服务器提交一个需要花很长时间处理的请求,而仍然能够接收到关于其状态的异步事件并监听事件。从技术角度来看,这有许多实现方法。其中一种方法就是使用一个与Java Servlet通信的Java Applet来获得异步信息。这是一种不错的方法,但是对于用户来说有些不太方便,因为他们必须下载一个JVM,还要下载一个applet到浏览器。此外,还必须维护一个从客户端到服务器的持久性套接字连接,以便接收异步消息。设想一下,如果有1000个用户使用该 applet,那么就有1000个执行线程几乎是在空等着发送事件通知到客户端。当然了,还有其它方法,比如从applet或AJAX应用程序构建轮询机制来定期检查新数据。而如果不经常接收到数据,那么轮询就显得无用了,而且还浪费了服务器资源,占用了执行线程。反之,服务器可以定期轮询,将事件传播回客户端,并维护套接字线程,而无需使用持久性执行线程。这非常类似于Java NIO的运行方式。理想情况下,我们都希望构建一个从服务器"异步"接收事件通知而无需在服务器端使用持久性执行线程的应用程序,不管它是一个 applet还是一个基于AJAX的薄Web应用程序。

此问题的一种解决方案是创建一个扩展Future Response Servlet类的servlet。浏览器建立了到Future Response Servlet类的单一连接,并在另一个线程中将它自身注册为一个监听程序。只要在服务器端接收到一个事件,线程就向客户端通知该事件。服务器与客户端保持异步,无需使用持久性执行线程。该模型可扩展用于多个并发用户的情况。

本文并不打算介绍如何构建AJAX应用程序。这方面的文章已经有很多了。本文的重点在于讨论表示层(比如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. private final Notifier notifier;

  13. public AsynchronousServerResponseServlet() {

  14. this.notifier = new Notifier();

  15. this.notifier.start();

  16. }

  17. public void service(HttpServletRequest request, FutureServletResponse
    response)

  18. throws IOException,ServletException {

  19. // push this client's request to a buffer and return immediately.

  20. // asynchronous processing occurs in the run method of the Notifier Thread

  21. notifier.poll(request, response);

  22. }

  23. class Notifier extends Thread {

  24. private static Stack clients = new Stack();

  25. void poll (HttpServletRequest request, FutureServletResponse response) {

  26. clients.push(new Client(request, response));

  27. }

  28. public void run() {

  29. while (!clients.empty()) {

  30. Client client = null;

  31. try{

  32. client = (Client) clients.pop();

  33. PrintWriter pw = client.response.getWriter();

  34. for(int j = 0; j < 10; j++) {

  35. pw.println("Time is:" + new Date() + "");

  36. pw.flush();

  37. }

  38. pw.close();

  39. }

  40. catch(Throwable t) {

  41. t.printStackTrace();

  42. }

  43. finally {

  44. try {

  45. client.response.send();

  46. }

  47. catch(IOException ioe) {

  48. ioe.printStackTrace();

  49. }

  50. }

  51. }

  52. }

  53. }

  54. // inner class that holds o-n to the clients http request and response

  55. class Client {

  56. private HttpServletRequest request;

  57. private FutureServletResponse response;

  58. private Client(HttpServletRequest request, FutureServletResponse
    response) {

  59. this.request = request;

  60. this.response = response;

  61. }

  62. }

可以看出,该例子非常简单。AsynchronousServerResponseServlet类扩展了Future Response Servlet,并重写了service方法。只使用一个线程(即Notifier类)来处理所有的客户端连接响应。对于每个HTTP请求,servlet向Notifier线程注册套接字连接,然后返回。异步事件被交付给客户端,而持久性套接字连接被维持。

单个线程可管理多个客户端连接!run()方法可用于根据某种消息选择条件回调事件到客户端。该例子只执行了一个服务器端的push操作,有些过分简单了。线程池可被用于某些类型的事件处理。

"如何扩展Future Response Servlet"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

服务器 服务 客户 客户端 线程 程序 应用程序 应用 事件 用户 方法 持久性 例子 套接字 情况 数据 浏览器 处理 浏览 不断 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 无锡东南大学网络安全研究生 软件开发专业男不想做编程 最前沿互联网科技榜 win7服务器管理器设置 软件开发周期简述 深圳有华软件开发有限公司 个人服务器推荐 前端直接修改数据库 pka计算机网络技术答案 软件开发的新岗位 世界如何让玩家永久踢出服务器 速达3000系统服务器进不了 英雄联盟服务器恢复了没有 智能硬软件开发设计报价 如何使用ssms修改数据库 乐清新浪软件开发有限公司 服务器管理绩效考核 网络安全等级龙头股 计算机网络技术高校专业排位 筑牢网络安全防线ppt 小马宝莉 哪个服务器的 图解 数据库四个范式 网络安全宣传动态ppt 人间地狱服务器多少钱一台 数据库联合主键外键约束 学校开展网络安全周教育 两节两会网络安全舆情 武汉有软件开发的大公司吗 易全印通显示无法连接数据库 潍坊哪些公司软件开发
0