Java 弹簧延迟结果';网络故障时未调用s onCompletion()

Java 弹簧延迟结果';网络故障时未调用s onCompletion(),java,spring,Java,Spring,我有一种机制,客户端向服务器发送bosh请求,比如说一次发送5个请求 我对它们进行排队,当服务器准备好响应时,将设置DefferedResult的结果并将其从队列中删除 如果DefferedResult对象超时,也将从队列中删除它(为所有DefferedResult设置了默认超时时间) 当客户端超时或收到请求响应时,客户端发送新的bosh请求 问题是,当服务器端onCompletion()方法调用超时时,但在其他情况下,如网络错误或客户端超时,则不会调用该方法。应该是的,对吧 注意:当客户端发生

我有一种机制,客户端向服务器发送bosh请求,比如说一次发送5个请求

我对它们进行排队,当服务器准备好响应时,将设置DefferedResult的结果并将其从队列中删除

如果DefferedResult对象超时,也将从队列中删除它(为所有DefferedResult设置了默认超时时间)

当客户端超时或收到请求响应时,客户端发送新的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;

}
@RequestMapping(value=“/adbosh”,method=RequestMethod.POST,products=“application/json”)
@应答器
公共延迟结果adBosh(HttpServletRequest请求,@RequestBody AdBoshInput输入){
final DeferredResult dr=新的DeferredResult(Utils.DEFAULT\u ASYNC\u TIMEOUT);
最终ADConnectorAuthenticationProvider ADConnectorAuthenticationProvider=服务。getAdConnectorAuthenticationProvider();
最后一个字符串ip=request.getRemoteAddr();
adConnectorAuthenticationProvider.register(ip、dr、input.getRequestId());
onCompletion博士(新Runnable(){
@凌驾
公开募捐{
adConnectorAuthenticationProvider.removeConnector(ip、dr);
}
});
返回dr;
}