带有两个请求的ajax请求的DeferredResult

时间:2015-04-04 10:22:26

标签: java javascript jquery ajax spring

我正在尝试使用带有ajax请求的DeferredResult,但是当我返回结果时,我的ajax请求一直在等待响应。

这是发出长轮询请求的客户端

    (function poll() {
var SUCCESS = 1;
var tenantName = $("#tenantName").val();
$.ajax({
    method: "GET",
    url: "url.do?subStep=" + subStep + "&tenantId=" + tenantName,
    success: function (response) {
        alert(response)
        if (response.status === SUCCESS) {
            bootbox.dialog({
                size:"small",
                message: "<div class='col-xs-offset-4'>" +
                "<i class='fa fa-user'> Page has been modify by " + response.payload + " " +
                "<a href='javascript:void(0)' onclick='reload()'>reload</a>" +
                "</i>" +
                "</div>"
            });
        }
    }, dataType: "json", complete: poll, timeout: 60000
});
})();

这是我的控制器,我每隔30秒就会通过Ajax发出一个长轮询请求。

@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public DeferredResult<JsonEntity> getSubStepStatus(@RequestParam("subStep") String subStep,
                                                   @RequestParam("tenantId") String tenantId) {
    if (tenantsInStep.get(subStep) == null) {
        initializeTenantsInStep(subStep);
    }
    if(!tenantsInStep.get(subStep).contains(tenantId)){
        tenantsInStep.get(subStep).add(tenantId);
    }
    DeferredResult<JsonEntity> deferredResult = new DeferredResult<>();
    tenantsDeferredInStep.put(tenantId, deferredResult);
    return deferredResult;
}

然后当我的应用程序检测到POST / PUT时,ajax请求会调用对我的控制器释放DeferredResults的方法的请求。

      @RequestMapping(value = "/setModification", method = RequestMethod.GET)
@ResponseBody
public final Integer setModification(@RequestParam("subStep") String subStep,
                                     @RequestParam("tenantId") String tenantId) {
    for (String tenantInStepId : tenantsInStep.get(subStep)) {
        if (!tenantId.equals(tenantInStepId)) {
            JsonEntity<String> jsonEntity = new JsonEntity();
            jsonEntity.setPayload(tenantId);
            jsonEntity.setStatus(FeedbackActions.SUCCESS.getCode());
            DeferredResult<JsonEntity> jsonEntityDeferredResult = tenantsDeferredInStep.get(tenantId);
            tenantsInStep.remove(tenantInStepId);
            jsonEntityDeferredResult.setResult(jsonEntity);
        }
    }
    return FeedbackActions.SUCCESS.getCode();
}

这个例子是由两个用户用两个浏览器来完成的,但是当第二个客户端调用deferredResult.setResult(bla)时,第一个创建deferredResult的客户端没有收到结果,没有调用ajax代码的警告。

我做错了什么?,我添加了

     <task:annotation-driven/>

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/webmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>

在我的applicationContext和web.xml配置中

作为我在本地测试Jetty上使用的额外信息 问候。

0 个答案:

没有答案
相关问题