我有一种机制,客户端向服务器发送波什请求,一次说5个请求。
我将它们排队,当服务器准备好响应时,正在设置DefferedResult的结果并从队列中删除。
如果DefferedResult对象超时,则也会从队列中删除它(为所有defferedResults设置默认超时时间)。
客户端在超时发生时发送新的bosh请求或获取请求的响应。
问题是,当正在调用服务器端onCompletion()
方法时发生超时,但在其他情况下,如网络错误或客户端超时,则不会调用该方法。它应该是,对吧?
注意:当客户端发生超时时,会关闭套接字连接,从而触发网络错误,因此应调用onCompletion()
方法。
控制器代码:
@RequestMapping(value = "/adbosh", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public DeferredResult<List<AdBoshOutput>> adBosh(HttpServletRequest request, @RequestBody AdBoshInput input) {
final DeferredResult<List<AdBoshOutput>> dr = new DeferredResult<List<AdBoshOutput>>(Utils.DEFAULT_ASYNC_TIMEOUT);
final ADConnectorAuthenticationProvider adConnectorAuthenticationProvider = services.getAdConnectorAuthenticationProvider();
final String ip = request.getRemoteAddr();
adConnectorAuthenticationProvider.register(ip, dr, input.getRequestId());
dr.onCompletion(new Runnable() {
@Override
public void run() {
adConnectorAuthenticationProvider.removeConnector(ip, dr);
}
});
return dr;
}