反向Ajax,第4部分:Atmosphere和CometD

  英文原文:Reverse Ajax, Part 4: Atmosphere and CometD

  前言

  这一系列文章展示了如何使用反向Ajax技术开发事件驱动的web应用第1部分内容介绍了反向Ajax(Reverse Ajax)、polling(轮询)、streaming(流)、Comet和长轮询(long polling);第2部分内容介绍了如何使用WebSocket来实现反向Ajax,并讨论了使用Comet和WebSocket的web服务器的局限性;第3部分内容说明的是,如果需要支持多种服务器或是为用户提供一个部署在他们自己的服务器上的独立web应用的话,实现自己的Comet或是WebSocket通信系统会存在一些难处。即使客户端的JavaScript代码很简单,但你需要用到一些异常处理、重连接和确认功能。在服务器端,全局性API的缺失和多种web服务器API导致了对框架的需求,这带来了一层抽象,第3部分内容还谈到了Socket.IO。

  在本文中,我们了解Atmosphere和CometD,它们是最广为人知的Java服务器开源反向Ajax库。

  你可以下载本文中使用的源代码。

  前提条件

  理想情况下,要充分体会本文的话,你应该对JavaScrpit和Java有一定的了解。若要运行本文中的例子,你还需要最新版本的Maven和JDK。

  Atmosphere框架

  Atmosphere是一个Java技术框架,其提供了通用的API来使用许多web服务器的Comet和WebSocket,这些web服务器包括了Tomcat、Jetty、GlassFish、Weblogic、Grizzly、JBossWeb、JBoss和Resin,其还支持任何支持Servlet 3.0规范的web服务器。在本系列文章提到的各个框架中,Atmosphere支持的服务器最多。

  Atmosphere可以检测本地化的服务器端API(针对Comet和WebSocket),对于Comet来说,如果可用的话,就切换回Servlet3.0;或者,依然是针对Comet,其会回退到一种“受管”的异步模式中(但没有达到Jetty Continuation的那种可伸缩性)。Atmosphere的存在已经超过了两年的时间,现在依然在处在活跃的发展阶段。其被用在大型的web应用中,比如说JIRA,这是一个最有名的问题追踪器。图1给出了Atmosphere的架构。

  图1. Atmosphere的架构一览

  Atmosphere由Atmosphere运行时组成,其为所有不同的web服务器解决方案和标准提供了一个通用的API。在这之上,客户端可以设置一个简单的servlet来通过Google Web Toolkit(GWT)访问该API和反向Ajax功能。或者,你也可以使用Jersey,一个实现了JSR-311(JAX-RS规范)的框架。有了所提供的额外注解,因此Atmosphere可用在RESTful服务中。在配置了所选择的模块后,你就可以通过实现一些类来访问Atomsphere运行时(本文稍后会讨论到)。你还可以选择使用一些提供的插件,这些插件增加了对集群、消息、依赖注入等的支持。如果你正在使用一个web框架(Wecket、Struts、Spring MVC)的话,则可以使用Atmosphere的MeteorServlet来透明地添加反向Ajax支持。这一Servlet暴露出一个Meteor对象,该对象可在你的控制器内部检索到,用来挂起或是恢复请求。

  Atmosphere的强大停留在服务器端:其提供一个了标准的API,该API覆盖了所有与WebSocket或是Comet通信的不同解决方案和方法。Atmosphere并未用到客户端和服务器端之间的协议,比如说Socket.IO和CometD等,这两种库都提供了一个客户端的JavaScript和一个服务器端的servlet,它们的通信用到了一种特定的协议(握手、消息、确认和心跳)。Atmosphere的目标是在服务器端提供一种通用的通信信道。如果你需要用到某种特定协议的话,比如说Bayeux(CometD用到的一个协议),就需要在Atmosphere中开发自己的“处理程序”。CometD插件就是这样做的:其利用了Atmosphere的API来挂起和恢复请求,并委托CometD的类来管理使用了Bayeux协议的CometD通信。

  Atmosphere所带的JQuery客户端库方便了连接的建立,其能够自动检测最好的可用传输方式(WebSocket或是CometD)。Atmosphere的jQuery插件的用法类似于HTML5 WebSocket API,首先你连接到服务器端,注册一个回调来接收信息,然后就可以推一些数据了。

  本文中的源代码包含了一个Atmosphere例子,该类直接用到了一个使用Atmosphere servlet的处理程序。客户端的代码则始终是相同的;与本系列的第1、2和3部分用户的代码一样(使用Comet长轮询的聊天例子)。你有可能使用了Atmosphere的JQuery插件,但这不是必须的,因为Atmosphere并不强制使用任何的通信协议。强烈建议你研究一下Atmosphere项目中的其他例子,特别是用到了JSR-311注解(Jersey)的那些,它们真正地简化了处理程序的编写。

  清单1. AtmosphereHandler接口

public interface AtmosphereHandler {
  void onRequest(AtmosphereResource resource)
  throws IOException;
  void onStateChange(AtmosphereResourceEvent event)
  throws IOException;
  void destroy();
}

it知识库反向Ajax,第4部分:Atmosphere和CometD,转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。