使用Jetty和DWR实现Comet Web应用程序

豆豆网   技术应用频道   2007年08月09日  【字号: 收藏本文

内容摘要:结合使用 Comet 模式(将数据推到客户机)和 Jetty 6 的 Continuations API(将 Comet 应用程序扩展到大量客户机中)。您可以方便地在 Direct Web Remoting (DWR) 2 中将 Comet 和 Continuations 与 Reverse Ajax 技术结合使用。

  resume() 方法生成一对 suspend()。可以将它们视为标准的 Object wait()/notify() 机制的 Continuations 等价体。就是说,suspend() 使 Continuation(因此也包括当前方法的执行)处于暂停状态,直到超出时限,或者另一个线程调用 resume()。suspend()/resume() 对于实现真正使用 Continuations 的 Comet 风格的服务非常关键。其基本模式是:从当前请求获得 Continuation,调用 suspend(),等待异步事件的到来。然后调用 resume() 并生成一个响应。

  然而,与 Scheme 这种语言中真正的语言级别的 continuations 或者是 Java 语言的 wait()/notify() 范例不同的是,对 Jetty Continuation 调用 resume() 并不意味着代码会从中断的地方继续执行。正如您刚刚看到的,实际上和 Continuation 相关的请求被重新处理。这会产生两个问题:重新执行 清单 4 中的 ContinuationServlet 代码,以及丢失状态:即调用 suspend() 时丢失作用域内所有内容。

  第一个问题的解决方法是使用 isPending() 方法。如果 isPending() 返回值为 true,这意味着之前已经调用过一次 suspend(),而重新执行请求时还没有发生第二次 suspend() 调用。换言之,根据 isPending() 条件在执行 suspend() 调用之前运行代码,这样将确保对每个请求只执行一次。在 suspend() 调用具有等幂性之前,最好先对应用程序进行设计,这样即使调用两次也不会出现问题,但是某些情况下无法使用 isPending() 方法。Continuation 也提供了一种简单的机制来保持状态:putObject(Object) 和 getObject() 方法。在 Continuation 发生暂停时,使用这两种方法可以保持上下文对象以及需要保存的状态。您还可以使用这种机制作为在线程之间传递事件数据的方式,稍后将演示这种方法。

来源:developerWorks    作者:Philip McCarthy    责编:豆豆技术应用

正在加载评论...