内容摘要:结合使用 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 责编:豆豆技术应用
- Java新闻
- Java入门教程
- Java开发工具
- J2EE
- J2SE
- J2ME
- EJB/Spring
- Applet/Swing
- Servlet/JSP
- Struts/Hibernate
- JDBC/JDO
- Ajax
- 认证考试
- JAVA对象比较器Comparator
- Java 6 RowSet 使用完全剖析
- 深入了解"Java"中的“异常机制”
- 讨论5种跟踪Java执行的方法
- Java专业术语标准化规范
- java中线程概念描述
- JAVA中的反射机制详解
- Java语言灵巧指针与垃圾回收
- 讲述java语言中内部类的研究
- Java对于Cookie的操作详解