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

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

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

让Continuations变得有用
 现在您已经看到Continuations运行servlet请求暂停而不消耗线程,我需要多解释一下Continuations API来展示怎样使用Continuations达到特殊的目的。 网管bitscn_com

 一个resume()方法和一个suspend()方法配对。您可以认为它们是标准的Object wait()/notify()机制的Continuations等价物。即,suspend()维持一个Continuation直到过期或者另一个线程调用resume()。suspend()/resume()方法是使用Continuations实现真实的Comet风格服务的关键所在。基本的模式是从当前请求维持Continuation,调用suspend(),然后等待直到您的异步时间到达,然后调用resume()并生成应答。

网管下载dl.bitscn.com

 但是,不像编程语言里真实的语言级continuations,如Scheme,或Java语言里的wait()/notify(),在Jetty Continuation上调用resume()并不意味着代码执行于它停止的确切位置。您已经看到,真正发生的是与Continuation相关的请求被重播。这导致两个问题:列表4的ContinuationServlet里代码不合需要的重新执行,以及丢失状态 -- 暂停时作用域里的任何东西都丢失了。 中国网管联盟bitsCN.com

 第一个问题的解决方案是isPending()方法,如果isPending()方法的返回值为true,这意味着suspend()在前面已经被调用过了,并且二次请求的执行不会再次接触suspend()方法。换句话说,给您的suspend()调用前的代码加上isPending()条件可以确保它只被执行一次。Continuation也提供了一个简单的机制来保持状态:putObject(Object)和getObject()方法。使用它们来维持一个context对象,这样当Continuation暂停时任何您需要维持的状态都可以得到保护。您也可以使用该机制作为一种在线程之间传递事件数据的方法,后面您将看到。 网管u家u.bitsCN.com

写一个基于Continuations的程序
 作为一个真实世界里的例子,我将开发一个基本的GPS坐标跟踪Web程序。它将在无规律间隔内生成随机的纬度-经度对。假设生成的坐标可以为附近的公众移动位置,如拿着GPS设备马拉松运动员,成队的汽车,或者运输中的包裹位置。有意思的部分在于我怎样告诉浏览器坐标信息。图1显示了这个简单的GPS跟踪程序的类图:
图1. 显示GPS跟踪程序主要组件的类图

 首先,该程序需要生成坐标的一些东西,这是RandomWalkGenerator的工作。从一个初始坐标开始,每次对它的私有方法generateNextCoord()的调用都从该位置随机走一步并返回一个GpsCoord对象。当初始化时,RandomWalkGenerator创建一个线程,该线程在随机间隔内调用generateNextCoorld()方法并发送生成的坐标给任何使用addListener()注册自己的CoordListener实例。
列表6显示了RandomWalkGenerator的循环逻辑:
列表6. RandomWalkGenerator的run()方法 网管bitscn_com

代码 

中国网管联盟bitsCN.com

public void run() { 中国网管论坛bbs.bitsCN.com

  try {
    while (true) {
      int sleepMillis = 5000 + (int)(Math.random()*8000d);
      Thread.sleep(sleepMillis);
      dispatchUpdate(generateNextCoord());
    }
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}

网管bitscn_com


网管u家u.bitscn@com

 CoordListener是一个定义了onCoord(GpsCoord coord)方法的回调接口。在例子中,ContinuationBasedTracker类实现了CoordListener。ContinuationBasedTracker的另外一个方法为getNextPosition(Continuation, int)。列表7显示了这些方法的具体实现:
列表7. ContinuationBasedTracker的内脏

代码 

网管u家u.bitsCN.com

public GpsCoord getNextPosition(Continuation continuation, int timeoutSecs) {

网管论坛bbs_bitsCN_com

  synchronized(this) {
    if (!continuation.isPending()) {
      pendingContinuations.add(continuation);
    }

网管网www_bitscn_com

    // wait for next update
    continuation.suspend(timeoutSecs*1000);
  }

网管u家u.bitscn@com

  return (GpsCoord)continuation.getObject();
} 网管网www_bitscn_com

public void onCoord(GpsCoord gpsCoord) { 网管bitscn_com

  synchronized(this) {
    for (Continuation continuation : pendingContinuations) { 中国网管论坛bbs.bitsCN.com

      continuation.setObject(pgsCoord);
      continuation.resume();
    } 中国网管论坛bbs.bitsCN.com

    pendingContinuations.clear();
  }
} 网管bitscn_com

网管联盟bitsCN@com

  中国网管联盟bitsCN.com

网管下载dl.bitscn.com


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

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