| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
让Continuations变得有用
现在您已经看到Continuations运行servlet请求暂停而不消耗线程,我需要多解释一下Continuations API来展示怎样使用Continuations达到特殊的目的。 网管bitscn_com
一个resume()方法和一个suspend()方法配对。您可以认为它们是标准的Object wait()/notify()机制的Continuations等价物。即,suspend()维持一个Continuation直到过期或者另一个线程调用resume()。suspend()/resume()方法是使用Continuations实现真实的Comet风格服务的关键所在。基本的模式是从当前请求维持Continuation,调用suspend(),然后等待直到您的异步时间到达,然后调用resume()并生成应答。
但是,不像编程语言里真实的语言级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 { 网管bitscn_com |
网管u家u.bitscn@com
|
代码 网管u家u.bitsCN.com public GpsCoord getNextPosition(Continuation continuation, int timeoutSecs) { 网管论坛bbs_bitsCN_com
synchronized(this) { 网管网www_bitscn_com
// wait for next update 网管u家u.bitscn@com return (GpsCoord)continuation.getObject(); public void onCoord(GpsCoord gpsCoord) { 网管bitscn_com synchronized(this) { continuation.setObject(pgsCoord); pendingContinuations.clear(); |
中国网管联盟bitsCN.com
|
0
|
评论加载中…