Supplier for timeout result in DeferredResult
Issue: SPR-17364
This commit is contained in:
parent
8df0bc88d2
commit
4ee704cedf
|
@ -19,6 +19,8 @@ package org.springframework.web.context.request.async;
|
|||
import java.util.PriorityQueue;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
@ -60,7 +62,7 @@ public class DeferredResult<T> {
|
|||
@Nullable
|
||||
private final Long timeout;
|
||||
|
||||
private final Object timeoutResult;
|
||||
private final Supplier<?> timeoutResult;
|
||||
|
||||
private Runnable timeoutCallback;
|
||||
|
||||
|
@ -79,18 +81,18 @@ public class DeferredResult<T> {
|
|||
* Create a DeferredResult.
|
||||
*/
|
||||
public DeferredResult() {
|
||||
this(null, RESULT_NONE);
|
||||
this(null, () -> RESULT_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a DeferredResult with a timeout value.
|
||||
* Create a DeferredResult with a custom timeout value.
|
||||
* <p>By default not set in which case the default configured in the MVC
|
||||
* Java Config or the MVC namespace is used, or if that's not set, then the
|
||||
* timeout depends on the default of the underlying server.
|
||||
* @param timeout timeout value in milliseconds
|
||||
*/
|
||||
public DeferredResult(Long timeout) {
|
||||
this(timeout, RESULT_NONE);
|
||||
this(timeout, () -> RESULT_NONE);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -99,11 +101,22 @@ public class DeferredResult<T> {
|
|||
* @param timeout timeout value in milliseconds (ignored if {@code null})
|
||||
* @param timeoutResult the result to use
|
||||
*/
|
||||
public DeferredResult(@Nullable Long timeout, Object timeoutResult) {
|
||||
this.timeoutResult = timeoutResult;
|
||||
public DeferredResult(@Nullable Long timeout, final Object timeoutResult) {
|
||||
this.timeoutResult = () -> timeoutResult;
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* Variant of {@link #DeferredResult(Long, Object)} that accepts a dynamic
|
||||
* fallback value based on a {@link Supplier}.
|
||||
* @param timeout timeout value in milliseconds (ignored if {@code null})
|
||||
* @param timeoutResult the result supplier to use
|
||||
* @since 5.1.1
|
||||
*/
|
||||
public DeferredResult(@Nullable Long timeout, Supplier<?> timeoutResult) {
|
||||
this.timeoutResult = timeoutResult;
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return {@code true} if this DeferredResult is no longer usable either
|
||||
|
@ -281,10 +294,11 @@ public class DeferredResult<T> {
|
|||
}
|
||||
}
|
||||
finally {
|
||||
if (timeoutResult != RESULT_NONE) {
|
||||
Object value = timeoutResult.get();
|
||||
if (value != RESULT_NONE) {
|
||||
continueProcessing = false;
|
||||
try {
|
||||
setResultInternal(timeoutResult);
|
||||
setResultInternal(value);
|
||||
}
|
||||
catch (Throwable ex) {
|
||||
logger.debug("Failed to handle timeout result", ex);
|
||||
|
|
Loading…
Reference in New Issue