Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SpringLongPolling示例代码?_Javascript_Ajax_Eclipse_Spring Mvc - Fatal编程技术网

Javascript SpringLongPolling示例代码?

Javascript SpringLongPolling示例代码?,javascript,ajax,eclipse,spring-mvc,Javascript,Ajax,Eclipse,Spring Mvc,我可以找到很多关于轮询工作多长时间的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点 基本上,我将如何使用ApacheTomcat来服务请求,以及如何编写一个简单的应用程序(spring)来“长轮询”服务器以获取新消息 这个例子不必是可伸缩的、安全的或完整的,它只需要工作! 如果有人能给我提供这样的教程或参考任何其他教程,我将不胜感激。这里是我能想到的最简单的例子 在控制器中: @RequestMapping("/longPolling") public String lon

我可以找到很多关于轮询工作多长时间的信息(例如,这个和这个),但没有简单的例子说明如何在代码中实现这一点

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

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

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

在控制器中:

@RequestMapping("/longPolling")
public String longPolling(Model model) {
  while(true) {
    // .. Do something, break when done...
    if( somethingIsDone ) {
       break;
    }
  }
  return "someResponse";
}
在调用它的视图中,您将设置一个ajax调用,并在超时时再次调用它。长轮询的思想是,服务器只有在有响应对象时才会响应

如果您使用的是Spring3.2,那么更好的方法是使用
或者从处理程序方法返回可调用的。如果您是Spring3.2之前的版本,那么可以使用几个框架来帮助您,比如Atmosphere,这些框架在Spring中工作得很好。有些甚至有JavaScript部分来简化客户端编码。

基于已经存在的anwser,一种更有效的“长轮询”变体,使用Servlet3API(Tomcat7)和Spring3.2带来的新功能

@RequestMapping(“/longPolling”)
公共未来投票(模型){
return callsomething where futureReturns();
}
关键是:未来只是指向未来结果的“指针”(不要从字面上理解)。因此,在处理上述代码后,该请求的调度线程将被挂起/退出,无论将来何时解决。解决未来问题后,/a线程将被重新附加并返回实际结果(在本例中为字符串)。但想想“Spring”,这也可能是一个转换为JSON的POJO


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

DeferredResult是Spring 3.2的新增功能,允许您将创建的DeferredResult传递给单独的进程。Callable是一个Java类,类似于Runnable。以允许单独的进程处理响应的方式实现Callable比较困难,尽管这并非不可能。以下是一个相当不错的博客,介绍如何让延迟结果正常工作: