春天推迟了

时间:2013-03-25 11:01:28

标签: ajax eclipse spring-mvc

我是Spring的新手,想要对网站实施长轮询,以便在所有客户都可以使用时立即显示管理员消息,我搜索谷歌数小时,只能找出deferredresult(spring 3.2)可以用来实现it.my的问题是如何通过延迟结果实现长轮询,如果有人能够推荐我这样的教程,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

另一种选择是使用AsyncContext。这将使初始GET请求保持“打开”状态,并使您能够发送多条消息作为响应的一部分,这与DeferredResult不同,后者只允许发送一条响应消息。这是一个good-link,解释了如何!

答案 1 :(得分:1)

Straight from the horses mouth

您有两个基本选项:选项1是可调用的 ,Callable返回String视图名称(您也可以使用@ResponseBody或其他一些常见的Spring返回类型,如ModelAndView,但我从未调查过)。

选项二是返回DeferredResult,就像Callable一样。除了你可以把它传递给一个单独的线程并在那里填写结果。同样,不确定是否可以返回ModelAndView或使用@ResponseBody返回XML / JSON,但我相信你可以。

答案 2 :(得分:0)

关于DeferredResult的简短背景: 您的控制器最终是由servlet容器(就此而言,假设服务器容器为Tomcat)工作线程执行的功能。您的服务流以Tomcat开头,以Tomcat结束。 Tomcat从客户端获取请求,保留连接,并最终向客户端返回响应。您的代码(控制器或servlet)在中间。

考虑以下流程:

  1. Tomcat获取客户端请求。
  2. Tomcat执行您的控制器。
  3. 释放Tomcat线程,但保持客户端连接(不返回响应)并在其他线程上运行繁重的处理。
  4. 完成繁重的处理后,请更新Tomcat的响应并将其返回给客户端(通过Tomcat)。

由于Servlet(您的代码)和Servlet容器(Tomcat)是不同的实体,因此要允许此流程(释放tomcat线程,但保持客户端连接),我们需要在their contract中提供此支持,包javax.servlet,在Servlet 3.0中引入。当控制器的返回值为DeferredResultCallable时,Spring MVC使用此新的Servlet 3.0功能,尽管它们是两个不同的东西。 Callablejava.util一部分的界面,它是对Runnable界面的改进。 DeferredResult是Spring设计的,用于在Spring MVC中为异步请求处理提供更多选项(我将描述),并且该类仅保存结果(如其名称所暗示)而您的Callable实现中包含异步代码。因此,这意味着您可以在控制器中同时使用两者,并使用Callable运行异步代码,并将结果设置为DeferredResult,这将是控制器的返回值。那么,使用DeferredResult作为返回值而不是Callable会得到什么呢? DeferredResult具有内置的回调,例如onErroronTimeoutonCompletion。它使错误处理变得非常容易。另外,由于它只是结果容器,因此您可以选择任何线程(或线程池)在异步代码上运行。使用Callable,您没有此选择。

Here,您可以找到我创建的简单工作示例,其中同时包含CallableDeferredResult这两个选项。