Spring DeferredResult的onCompletion()没有在网络故障时被调用

时间:2016-07-13 07:49:51

标签: java spring

我有一种机制,客户端向服务器发送波什请求,一次说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;

}

0 个答案:

没有答案