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

豆豆网   技术应用频道   2007年08月09日    社区交流

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

  暂停的请求将一直保持在等待状态的 Continuation 队列,直到超出指定的时限,或者当对 resume() 方法的 Continuation 调用 resume() 时(稍后将详细介绍)。出现上述任意一种条件时,请求将被重新提交到 servlet(通过过滤器链)。事实上,整个请求被重新进行处理,直到首次调用 suspend()。当执行第二次发生 suspend() 调用时,RetryRequest 异常不会被抛出,执行照常进行。

  现在应该可以解释 清单 5 中的输出了。每个请求依次进入 servlet 的 service() 方法后,将发送 start 消息进行响应,Continuation 的 suspend() 方法引发 servlet 异常,将释放线程使其处理下一个请求。所有五个请求快速通过 service() 方法的第一部分,并进入等待状态,并且所有 start 消息将在几毫秒内输出。两秒后,当超过 suspend() 的时限后,将从等待队列中检索第一个请求,并将其重新提交给 ContinuationServlet。第二次输出 start 消息,立即返回对 suspend() 的第二次调用,并且发送 end 消息进行响应。然后将在此执行 servlet 代码来处理队列中的下一个请求,以此类推。

  因此,在 BlockingServlet 和 ContinuationServlet 两种情况中,请求被放入队列中以访问单个 servlet 线程。然而,虽然 servlet 线程执行期间 BlockingServlet 发生两秒暂停,SelectChannelConnector 中的 ContinuationServlet 的暂停发生在 servlet 之外。ContinuationServlet 的总吞吐量更高一些,因为 servlet 线程没有将大部分时间用在 sleep() 调用中。

  使 Continuations 变得有用

  现在您已经了解到 Continuations 能够不消耗线程就可以暂停 servlet 请求,我需要进一步解释 Continuations API 以向您展示如何在实际应用中使用。

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

正在加载评论...