【问题标题】:spring longpolling example code?春季长轮询示例代码?
【发布时间】:2013-03-15 22:07:32
【问题描述】:

我可以找到很多关于长轮询如何工作的信息(例如,this 和 this),但没有关于如何在代码中实现它的简单示例。

基本上,我将如何使用 Apache Tomcat 来处理请求,以及如何编写一个简单的应用程序 ( spring ) 来“长轮询”服务器以获取新消息?

示例不必是可扩展的、安全的或完整的,它只需要工作即可! 如果有人能给我这样的教程或参考任何其他教程,我将不胜感激。

【问题讨论】:

    标签: javascript ajax eclipse spring-mvc


    【解决方案1】:

    这是我能想到的最简单的例子……

    在控制器中:

    @RequestMapping("/longPolling")
    public String longPolling(Model model) {
      while(true) {
        // .. Do something, break when done...
        if( somethingIsDone ) {
           break;
        }
      }
      return "someResponse";
    }
    

    在调用此的视图中,您将设置一个 ajax 调用,并在超时时再次调用它。长轮询的想法是服务器只有在它有响应时才会响应。

    如果您使用 Spring 3.2,更好的方法是使用 DeferredResult 或从您的处理程序方法返回一个 Callable。如果您是 Spring 3.2 之前的版本,那么您可以使用几个框架来提供帮助,例如 Atmosphere,它们与 Spring 配合得很好。有些甚至有 JavaScript 部分来简化客户端编码。

    【讨论】:

    • DeferredResult 是 Spring 3.2 的新增功能,允许您将创建的 DeferredResult 传递给单独的进程。 Callable 是一个 Java 类,类似于 Runnable。以允许单独进程处理响应的方式实现 Callable 更难,尽管并非不可能。这是一篇关于如何让 DeferredResult 工作的相当不错的博客:blog.springsource.org/2012/05/13/…
    【解决方案2】:

    基于现有的 anwser,使用 Servlet 3 API (Tomcat 7) 和 Spring 3.2 附带的新内容的更有效的“长轮询”变体

    @RequestMapping("/longPolling")
    public Future<String> longPolling(Model model) {
      return callSomethingWhereAFutureReturns();
    }
    

    重点是:未来只是指向未来结果的“指针”(不要从字面上理解)。因此,在处理完上述代码后,该请求的调度线程将被挂起/退出,无论未来何时解决。当 future 被解析时,/a 线程将被重新附加并返回实际结果(在本例中为字符串)。但是想想“Spring”,这也可能是一个转换为 JSON 的 POJO。

    只有当未来的结果将由另一个线程解决时,这才有意义。在聊天应用程序中,这将是带有新消息的另一个请求线程(不推荐)或专用调度程序线程(更好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-19
      • 2014-08-10
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多