网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 其它技术 > 使用Jetty和DWR创建伸缩性Comet程序  

使用Jetty和DWR创建伸缩性Comet程序

2007-07-30  作者:bitsCN整理  来源:Philip McCarthy   点评 投稿 收藏

 create元素的javascript元素指定了DWR用来暴露tracker作为一个JavaScript对象的名字。但是,在这里,我的客户端代码不会使用它,而是从tracker推数据给它。同时,也需要在web.xml里做一些额外的配置来让DWR使用反转Ajax,见列表12。
列表12. DwrServlet的web.xml配置 网管bitscn_com


代码  网管论坛bbs_bitsCN_com

<servlet>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>
    org.directwebremoteing.servlet.DwrServlet
  </servlet-class>
  <init-param>
    <param-name>activeReverseAjaxEnabled</param-name>
    <param-value>true</param-value>
  </init-param>
  <init-param>
    <param-name>initApplicationScopeCreatorsAtStartup</param-name>
    <param-value>true</param-value>
  </init-param>
</servlet>

网管论坛bbs_bitsCN_com


网管论坛bbs_bitsCN_com

 第一个servlet init-param,activeReverseAjaxEnabled,激活轮询和Comet功能。第二个,initApplicationScopeCreatorsAtStartup,告诉DWR当程序开始时初始化ReverseAjaxTracker。这会覆盖通常在bean上作第一次请求时的延迟初始化行为 -- 在这里这是很有必要的,因为客户端从不在ReverseAjaxTracker上调用方法。

网管网www.bitscn.com

 最后,我需要实现从DWR调用的客户端JavaScript方法。回调方法updateCoordinate()被传递一个JSON形式的GpsCoord对象,它由DWR的BeanConverter自动序列化。这个方法仅仅从坐标提取longitude和latitude域并通过DOM调用添加它们到一个列表里。这在列表13里显示了,同我的页面的onload方法一起。onload包含对dwr.engine.setActiveReverseAjax(true),这告诉DWR打开一个到服务器的持久的连接来等待回调。
列表13. 反转Ajax GPS跟踪的客户端实现

网管论坛bbs_bitsCN_com

代码  中国网管论坛bbs.bitsCN.com

window.onload = function() {
  dwr.engine.setActiveReverseAjax(true);
} 中国网管联盟bitsCN.com

function updateCoordinate(coord) {
  if (coord) {
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(coord.longitude + ", " + coord.latitude));
    document.getElementById("coords").appendChild(li);
  }
} 网管u家u.bitscn@com


网管u家u.bitsCN.com

 现在我可以让我的浏览器访问跟踪程序页面,当坐标数据开始生成时DWR将开始推数据到客户端。这个实现将简单的输出一个生成的坐标列表,见图2:
图2. ReverseAjaxTracker输出

 使用反转Ajax创建一个事件驱动的Ajax程序是如此简单。记住,感谢DWR对Jetty Continuations的使用,当等待新事件到达时线程不会阻塞在服务器。

网管联盟bitsCN@com

 据此,很容易从Yahoo!或者Google集成一个地图窗口部件。通过改变客户端回调方法,坐标可以简单的传递到地图API,而不是直接添加到页面。图3显示了在这样的一个地图组件上DWR反转Ajax GPS跟踪程序描绘的随机路线:
图3. 使用地图UI的ReverseAjaxTracker
网管u家u.bitscn@com

结论
 现在您看到了Jetty Continuations联合Comet可以提供一个高效的、可伸缩的事件驱动Ajax程序的解决方案。我没有给出Continuations的伸缩性的图,因为性能在真是世界里取决于许多变数。服务器硬件、操作系统的选择、JVM实现、Jetty配置、您的Web程序的设计和传输效率在负荷下都会影响Jetty Continuations的性能。尽管如此,Webtide的Greg Wilkins(首要的Jetty开发者) 发布了一个比较Jetty 6集成Continuations与不集成Continuations的Comet程序处理10,000并发请求时的性能的白皮书。在Greg的测试里,使用Continuations并去掉了线程消费和栈内存消费,使用大于10的因数。 中国网管联盟bitsCN.com

 您也看到了使用DWR的反转Ajax技术实现事件驱动的Ajax程序是多么容易。DWR不仅节省您的客户端和服务端代码,反转Ajax也将整个服务器推机制从您的代码中抽象出来。您可以随意转换您的Comet方式:轮询或者piggyback方式,只需简单的更改DWR配置。您可以随意试验并找到适合您的程序的最佳策略而不会影响您的代码。

网管下载dl.bitscn.com

关于作者
Philip McCarthy是伦敦的一位软件开发顾问,专于Java和Web技术。

网管论坛bbs_bitsCN_com

网管联盟bitsCN_com


TAGs   程序   创建   使用   一个   请求   客户端   DWR   代码   Continuations      
 上一篇:介绍java 产生随机数的两种方式   下一篇:使用MOCK对象进行单元测试
使用Jetty和DWR创建伸缩性Comet程序 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: