Defensive processing of timeout callback and timeout result

Issue: SPR-14978
This commit is contained in:
Juergen Hoeller
2016-12-17 12:57:18 +01:00
parent 9376748c9c
commit 9ba4b47bee

View File

@@ -253,13 +253,24 @@ public class DeferredResult<T> {
return new DeferredResultProcessingInterceptorAdapter() { return new DeferredResultProcessingInterceptorAdapter() {
@Override @Override
public <S> boolean handleTimeout(NativeWebRequest request, DeferredResult<S> deferredResult) { public <S> boolean handleTimeout(NativeWebRequest request, DeferredResult<S> deferredResult) {
if (timeoutCallback != null) { boolean continueProcessing = true;
timeoutCallback.run(); try {
if (timeoutCallback != null) {
timeoutCallback.run();
}
} }
if (timeoutResult != RESULT_NONE) { finally {
setResultInternal(timeoutResult); if (timeoutResult != RESULT_NONE) {
continueProcessing = false;
try {
setResultInternal(timeoutResult);
}
catch (Throwable ex) {
logger.debug("Failed to handle timeout result", ex);
}
}
} }
return true; return continueProcessing;
} }
@Override @Override
public <S> void afterCompletion(NativeWebRequest request, DeferredResult<S> deferredResult) { public <S> void afterCompletion(NativeWebRequest request, DeferredResult<S> deferredResult) {