Spring MVC中的延迟结果返回错误响应

 覃思慧_419 发布于 2023-02-13 20:29

我使用spring mvc 3.2.4和jquery 1.9.0进行长轮询.我的应用程序部署在Tomcat 7.0.42上.我的spring配置文件如下:

应用程序Web.xml



    
        index.html
    

    
        app

        
            org.springframework.web.servlet.DispatcherServlet
        

        1
        true
    

    
        app
        /
    

    
        
            org.springframework.web.context.ContextLoaderListener
        
    

    
        contextConfigLocation
        
            /WEB-INF/app-servlet.xml
        
    


Spring Configration xml为: -



        
          
        
        
        

发布数据的控制器看起来像

@RequestMapping(value = "/postComment", method = RequestMethod.POST)
public @ResponseBody String postComment(HttpServletRequest request) {
    deferredResultContainer.updateAllResults(request.getParameter("comment"));
    return "success";
}

延迟结果容器类

public class DeferredResultContainer {
    private final Set> deferredResults =   Collections.synchronizedSet(new HashSet>() ); 

    public void put(DeferredResult deferredResult){ 
        deferredResults.add(deferredResult); 
    } 

    public void updateAllResults(String value){
        for (DeferredResult deferredResult : deferredResults){ 
            deferredResult.setResult(value); 
        }
    }

    public void remove(DeferredResult deferredResult){ 
        deferredResults.remove(deferredResult); 
    } 

    public int determineSize(){
        return deferredResults.size();
    }
}

延迟结果的控制器看起来像

 @RequestMapping(value = "/getComments", method = RequestMethod.GET)
 @ResponseBody
 public DeferredResult getComments() throws Exception{
     final DeferredResult deferredResult= new DeferredResult(); 
     deferredResultContainer.put(deferredResult);
     deferredResult.onTimeout(new Runnable() {

         @Override public void run() {
             deferredResultContainer.remove(deferredResult);
         }
     });

     deferredResult.onCompletion(new Runnable() { 
         @Override public void run() { 
             deferredResultContainer.remove(deferredResult); 
         } 
     });
     return deferredResult;
 }

当我试图通过ajax进行长时间轮询时,我得到以下回应: -

{"setOrExpired":false}

并且onCompletion方法也没有被执行.

简单来说控制器下面的东西可以得到完美的响应{{1":"2"}

@RequestMapping(value = "/test1", method = RequestMethod.GET)
@ResponseBody
public Map test1() throws Exception{
     Map m1 = new HashMap();
     m1.put("1", "2");
     return m1;
}

一旦我将其更改为下面并添加延迟结果我得到响应为{"setOrExpired":true}

@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public DeferredResult test() throws Exception{
    DeferredResult result = new DeferredResult();
     Map m1 = new HashMap();
     m1.put("1", "2");
     result.setResult(m1);
     return result;
}

轮询代码

$(document).ready(function() {
    longPoll();

    function longPoll(){
         $.support.cors = true;
        var path = "http://localhost:8080/WebChatExp/rest";
         $.ajax({
            url: path + "/getComments",
            cache:false,
            success: function(data){
                //To Do
                            alert("Data" + JSON.stringify(data));
            },
            error: function(err, status, errorThrown ) {

            },
            type: "GET",
            dataType: "json",
            complete: longPoll,
            timeout: 60000 // timeout every one minute
        }); 
    }

我搜索了各种示例,但无法确定延迟结果是否需要任何额外配置.请指教.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有