您当前位置: 圣才学习网首页 >> IT类 >> Web开发技术

详解Ajax+Apache Geronimo中异步消息框架的实现

扫码手机阅读
用圣才电子书APP或微信扫一扫,在手机上阅读本文,也可分享给你的朋友。
评论(0
来源:网络 作者:未知
框架组件概览
经过良好设计的面向服务的业务层可以帮助您将松散耦合的服务组成过程和复合应用程序。面向服务的架构(Service-Oriented ArchitectureSOA)中的这种服务组合使您能够用不同环境中的服务构建应用程序和过程,而无需了解每种环境的细节。使用 SOA 可获得的益处依赖于使用一般、粗略的接口设计和实现的服务。
在开发基于浏览器的 UI 时,Ajax 编程将为您提供强大的功能和很大的灵活性。将此 UI 功能与面向服务的业务层结合使用还将为您提供更大的灵活度。Ajax 编程本身十分适于进行异步请求和响应。在将 Ajax 的异步本性与基于异步的消息传递系统结合使用时,您可以构建基于浏览器的应用程序,这样做将使用户体验更近似于桌面应用程序,给用户一种更加实时的感受。
Apache Geronimo 是一个模块化的符合 Java™ 2 Platform, Enterprise Edition (J2EE) 规范的应用服务器平台,它基于使用控制反转(Inversion of ControlIoC)的架构解耦组件和服务以构建企业级应用程序和服务。
在本文中,您将了解如何使用基于消息的框架或总线处理来自客户机的异步业务请求,以便在多个基于 Ajax 的客户机与基于 Geronimo 的服务器之间进行交互。了解如何在浏览器与服务器之间跟踪基于 Ajax 的客户机请求。并了解如何通过目标业务服务的面向消息的服务总线在服务器端跟踪这些请求。
Ajax 简介
Ajax 是一个受基于 XML 的请求和响应服务器调用模型驱动的 UI 功能和概念的框架。这些概念本性上大都具有不定性,但是都根据约定经过标准化。这些概念在 Ajax 应用程序开发中大多以标准的形式出现,已成为主流 Web 浏览器的功能。
Ajax UI 依赖于浏览器中的文档对象模型(Document Object ModelDOM)功能和 JavaScript 组件,这些功能和组件用于在任何指定时间解析和显示 Web 页面。很多(但不是所有)这类功能和组件都是由大多数主流 Web 浏览器共享的。这么多的内容掌握起来可能有些困难,因此本文仅讨论 DOM 和面向 Ajax JavaScript 代码的最基础功能。
几乎所有称得上是基于 Ajax 的应用程序都会创建称为 XMLHttpRequest 对象的组件。此 JavaScript 对象用于构造请求和在浏览器与服务器之间来回传输请求。清单 1 中的代码片段将创建可以在 Mozilla Firefox 浏览器或 Microsoft® Windows® Internet Explorer® 浏览器与服务器之间使用的 XMLHttpRequest 对象的实例。
清单 1. 创建 XMLHttpRequest 对象
function getHTTPObject()
{
  var xmlhttp = null;
  var success = false;
  // List of MS XMLHTTP versions - newest first
  var MSXML_XMLHTTP_PROGIDS = new Array(
    'MSXML2.XMLHTTP.5.0',
    'MSXML2.XMLHTTP.4.0',
    'MSXML2.XMLHTTP.3.0',
    'MSXML2.XMLHTTP',
    'Microsoft.XMLHTTP'
  );
  for (var i = 0; i < MSXML_XMLHTTP_PROGIDS.length && !success; i++)
  {
   try
   {
     xmlhttp = new ActiveXObject(MSXML_XMLHTTP_PROGIDS[i]);
     success = true;
     return xmlhttp;
   }
   catch (e)
   {
     xmlhttp = false;
   }
  }
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined')
  {
   try
   {
     xmlhttp = new XMLHttpRequest();
   }
   catch (e)
   {
     xmlhttp = false;
   }
  }
  return xmlhttp;
}
创建 XMLHttpRequest 对象的实例后,您可以使用该实例向 HTTP 服务器组件(例如 Java servlet)发送 HTTP 请求和从 HTTP 服务器组件接收 HTTP 请求。清单 2 中的代码片段将使用 XMLHttpRequest 对象向 HTTP 服务器组件发送 HTTP GET 请求。
清单 2. 使用 XMLHttpRequest 对象发送 HTTP GET 请求
function callService(url)
{
  if (!isWorking)
  {
   httpObj.open("GET", url, true);
   try
   {
    httpObj.setRequestHeader("Content-type", "text/plain");
   }
   catch(e)
   {
    // setRequestHeader is missing in versions of Opera
   }
   isWorking = true;
   httpObj.onreadystatechange = handleServiceResponse;
   httpObj.send(null);
   return true;
  }
}
HTTP 响应都是由被指定为 XMLHttpRequest 对象的 onreadystatechange 字段值的 JavaScript 回调函数异步处理的。该值在清单 2 中被指定为 handleServiceResponse。清单 3 中的代码片段显示了 onreadystatechange 回调函数的典型实例化示例。
清单 3. 在回调函数中处理 XMLHttpRequest 实例的响应
function handleServiceResponse()
{
  if (httpObj.readyState == 4) // a value of 4 represents a request-completed state
  {
   isWorking = false;
   if (httpObj.status == 200)
   {
    var contentType = httpObj.getResponseHeader("Content-type");
    var xmlDoc = httpObj.responseXML.documentElement;
    var textResponse = httpObj.responseText;
    // do something with either xmlDoc or textResponse or with both
   }
  }
}
现在,HTTP 请求可以通过基于 Ajax 的浏览器页面来发送和接收,您必须构造一个服务器组件来处理请求和传送响应。本例将使用部署到 Apache Geronimo 应用服务器上的 Java servlet
Apache Geronimo 简介
Geronimo 应用服务器是可用于构建企业级应用程序和服务的完全符合 J2EE 规范的应用程序平台。Geronimo 是具有良好的可配置性、模块化且基于使用 IoC 技术有效地将组件与服务解耦的一个架构。Geronimo 还将利用 Java Management Extension (JMX) 和类似的专用管理框架使 Geronimo 成为易于监视、配置和管理的平台。
下载和安装 Apache Geronimo
参考资料部分中列出的站点下载 Geronimo 平台,并将文件解压缩到名为 {GERONIMO_HOME} 的目录中。然后执行 Geronimo 安装的 {GERONIMO_HOME}\bin\ 目录中的 startup 脚本。您应当会看到类似图 1 所示的控制台窗口。
1. Geronimo 启动
启动控制台显示了一系列载入和启动的模块、连接器和应用程序,Geronimo 运行时环境就在这些对象中创建。您可以使用 Geronimo 安装的 {GERONIMO_HOME}\bin\ 目录中的 shutdown 脚本停止 Geronimo 运行。
异步消息传递
异步消息传递系统的设计思想是:消息接收方不知道也不关心给定消息的来源;相反,消息接收方假定它可以收到所有的信息,从而用收到的每条消息执行相应任务。消息发送方与消息接收方之间的这种解耦有时被称为发布/订阅关系,这是异步消息传递系统的一种最有用的功能。
异步消息传递系统通常依赖于消息总线或消息代理公开用于接收消息生成方所发布的消息的队列或事件通道。该总线或代理还将公开一个订阅接口,感兴趣的消息接收方或事件用户可使用此接口将自身注册为针对给定消息或事件类型的通知侦听程序。
Ajax 系统
本文介绍的基于异步消息的框架将使用一个消息总线,该总线利用事件通道将源于 Ajax 的消息传送给业务服务。事件通道还可以向感兴趣的侦听程序通知事件是否已经被业务服务成功处理。
耦合指软件组件与服务相互依赖的程度。定义了一组服务或组件的耦合度将决定在编译时和运行时必须提供哪些对象。松散耦合的组件可以相互独立地运行,还可以相互独立地进行开发和部署,在运行时再指定这些组件的关系。这通常被称为运行时绑定或延迟绑定。
使用处理异步业务请求的基于消息的框架或总线要求存在松散耦合的业务服务来处理每条独立异步消息的目标业务逻辑。
您可以使用一系列机制将业务服务与服务使用方解耦。远程过程调用(Remote Procedure CallRPC)存根和框架、基于 XML 模式定义(XML Schema DefinitionXSD)模式的签名和标准化接口只是这些机制中的一些。本例将使用标准的粗略接口 BusinessService,该接口将用一般消息数据作为参数定义一个执行方法。
接受一般数据而不接受强类型对象的方法签名的目标在于确保调用函数与目标对象之间的松散耦合。使用强类型对象作为参数从而结合数据与代码,暗示了一种特定行为。在跨组件或服务边界执行行为后,可以轻松形成紧密耦合。传递一般消息数据意味着不执行任何行为并阻止紧密耦合的形成。
清单 4 中的代码片段演示了 BusinessService 接口。
清单 4. 标准业务服务接口
public interface BusinessService
  extends Serializable
{
  public void setID(String id);
  public String getID();
  public Object execute(String methodName, Object[] params)
    throws ServiceException;
}
客户机与服务器之间的消息流
本例的 UI 由一个简单的支持 Ajax JavaServer Page (JSP) 组件构成。JSP 将定义一个表单(参见清单 5),该表单用于使用先前讨论的 XMLHttpRequest 对象向服务器传递服务请求。
清单 5. 支持 Ajax HTML 表单
<form name="ServiceRequestForm" method="POST" onSubmit="return false">
  <table>
   <tr>
    <th>
     Raw Ajax XML
    </th>
    <th>
     User Names
    </th>
   </tr>
   <tr>
    <td>
     <textarea name="result" id="result" cols="40" ROWS="8"></textarea>
    </td>
    <td>
     <textarea name="users" id="users" COLS="20" ROWS="8"></textarea>
    </td>
   </tr>
   <tr>
    <td colspan="2">
     <input name="submit" id="submit" type="submit" value="Get User Names"
         onclick="callService('services?ServiceName=UserAccountService&'
                   + 'MethodName=getUserNames&ServiceParams=');">
     <input name="reset" id="reset" type="reset"
         onclick="resetFields();">
    </td>
   </tr>
  </table>
</form>
由表单发起的请求都是使用 callService JavaScript 函数发出的,该函数将使用 XMLHttpRequest 对象处理 HTTP 通信。当 servlet 收到消息后,该消息将被转换为异步消息并通过最终得到业务服务请求和基于 XML 的服务响应的 Java 组件框架来发送。
2 演示了 Ajax 系统的消息流程和方法调用流程。
2. 异步系统流程
如图 2 所示,流程如下:
FrontController servlet Web 层收到一条消息。
FrontController servlet 使用请求处理程序将每个 HTTP 请求转换为规范化的异步消息。
每条消息连同异步回调侦听程序一起被发布到驻留在业务层的消息总线。
消息总线将创建一个事件对象,并且将该事件对象连同业务服务的实例一起发送给事件通道。
事件通道将执行调用业务服务和向订阅事件通道的所有侦听程序通知事件成功完成还是未能完成两项任务。
数据将以模型对象的形式在层与组件之间来回传递。模型对象可以根据需要(例如当 FrontController servlet 响应基于 XML Ajax 客户机时)被序列化为 XML
系统中的基本概念是使用回调对象,通过使用回调对象可以将给定操作是成功还是失败回传给负责处理失败或成功的组件。最终,这个失败或成功状态被发送给 Ajax 客户机并显示给用户。回调对象与异步通知之间的依赖性将导致出现一个在典型请求或响应 Web 应用程序中不太常见的顾虑:及时响应客户机请求的挑战,牢记用户注意广度和 HTTP 超时限制。为了打消这个顾虑,通常在业务层中使用超时来确保过程的阻塞不超出合理的时间长度。Java Timer 对象、子线程、begin-wait-abort 循环和消息队列超时都是可用于强制执行有效的超时限制的几种机制。本例中的系统将使用简单的 begin-wait-abort 循环。
整合异步消息传递系统与 Apache Geronimo
Geronimo 可以帮助简化异步消息传递系统的部署操作。该系统被打包成 WAR 文件,然后再使用 Geronimo 平台附带的 Deployer 工具部署到 Geronimo 中。Deployer 工具可在位于 {GERONIMO_HOME}\bin\ deployer.jar 中找到,其中 {GERONIMO_HOME} Geronimo 的安装目录。
创建 WAR 文件
运行清单 6 中所示的命令来编译系统类并创建 WAR 文件。
清单 6. 创建 WAR 文件
{YOUR_PROJECT_DIR}{MAVEN_HOME}\bin\mvn clean compile war:war
部署 WAR 文件
运行清单 7 中的命令将 WAR 文件部署到 Geronimo 应用服务器上。
清单 7. 部署 .war 文件
{YOUR_PROJECT_DIR}{JAVA_HOME}\bin\java -jar {GERONIMO_HOME}\bin\deployer.jar deploy \
target/GeronimoAndAJAX-1.1.war
您应当会看到类似清单 8 所示的结果。
清单 8. WAR 文件部署结果
Username: system
Password: *******
   Deployed default/GeronimoAndAJAX-1.1/1169329928406/war @
   http://localhost:8080/GeronimoAndAJAX-1.1
运行异步消息传递系统
通过把 Web 浏览器指向 http://localhost:8080/GeronimoAndAJAX-1.1,从异步消息传递系统的启用 Ajax 的启动页面向服务器发送一条消息。这样将显示类似图 3 所示的启动页面。
3. 异步系统启动页面
当您看到启动页面时,单击 Submit Query 以发出异步服务调用。显示在浏览器窗口中的页面应当类似图 4 所示。
4. 异步系统结果页面
注意,从服务器接收未经加工的 XML 的方法显示在左栏,而表示结果的经过格式处理的列表显示在右栏。
结束语
Ajax 编程给 Web 应用程序开发人员提供了比传统 Web 开发方法更强大的功能和灵活性。结合使用此力量与松散耦合的面向服务的业务层还将给您提供更多灵活性和功能。Ajax 设计用于在异步请求和响应环境中运行。结合使用基于异步的消息传递系统和 Ajax 的异步本性将为用户提供更加实时、更加类似于桌面应用程序的体验。
本文讨论了一种方法来使用 Apache Geronimo 构建利用松散耦合的业务服务结合 Ajax UI 的异步本性与异步消息传递系统的系统。跟踪了基于 Ajax 的客户机与基于消息的框架或总线的交互(该框架或总线将 Ajax 客户机发起的异步业务请求发送给业务服务)。
 

小编工资已与此挂钩!一一分钱!求打赏↓ ↓ ↓

如果你喜欢本文章,请赐赏:

已赐赏的人
最新评论(共0条)评论一句