我是Spring的新手,想要对网站实施长轮询,以便在所有客户都可以使用时立即显示管理员消息,我搜索谷歌数小时,只能找出deferredresult(spring 3.2)可以用来实现it.my的问题是如何通过延迟结果实现长轮询,如果有人能够推荐我这样的教程,我将不胜感激。
答案 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)在中间。
考虑以下流程:
由于Servlet(您的代码)和Servlet容器(Tomcat)是不同的实体,因此要允许此流程(释放tomcat线程,但保持客户端连接),我们需要在their contract中提供此支持,包javax.servlet
,在Servlet 3.0中引入。当控制器的返回值为DeferredResult
或Callable
时,Spring MVC使用此新的Servlet 3.0功能,尽管它们是两个不同的东西。 Callable
是java.util
一部分的界面,它是对Runnable
界面的改进。 DeferredResult
是Spring设计的类,用于在Spring MVC中为异步请求处理提供更多选项(我将描述),并且该类仅保存结果(如其名称所暗示)而您的Callable
实现中包含异步代码。因此,这意味着您可以在控制器中同时使用两者,并使用Callable
运行异步代码,并将结果设置为DeferredResult
,这将是控制器的返回值。那么,使用DeferredResult
作为返回值而不是Callable会得到什么呢? DeferredResult
具有内置的回调,例如onError
,onTimeout
和onCompletion
。它使错误处理变得非常容易。另外,由于它只是结果容器,因此您可以选择任何线程(或线程池)在异步代码上运行。使用Callable,您没有此选择。
Here,您可以找到我创建的简单工作示例,其中同时包含Callable
和DeferredResult
这两个选项。