我正在尝试使用带有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上使用的额外信息 问候。