|
|
|
|
@ -15,6 +15,7 @@
@@ -15,6 +15,7 @@
|
|
|
|
|
*/ |
|
|
|
|
package org.springframework.web.context.request.async; |
|
|
|
|
|
|
|
|
|
import java.util.PriorityQueue; |
|
|
|
|
import java.util.concurrent.Callable; |
|
|
|
|
|
|
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
@ -28,10 +29,24 @@ import org.springframework.web.context.request.NativeWebRequest;
@@ -28,10 +29,24 @@ import org.springframework.web.context.request.NativeWebRequest;
|
|
|
|
|
* concurrently on behalf of the application, with a {@code DeferredResult} the |
|
|
|
|
* application can produce the result from a thread of its choice. |
|
|
|
|
* |
|
|
|
|
* <p>Subclasses can extend this class to easily associate additional data or |
|
|
|
|
* behavior with the {@link DeferredResult}. For example, one might want to |
|
|
|
|
* associate the user used to create the {@link DeferredResult} by extending the |
|
|
|
|
* class and adding an addition property for the user. In this way, the user |
|
|
|
|
* could easily be accessed later without the need to use a data structure to do |
|
|
|
|
* the mapping. |
|
|
|
|
* |
|
|
|
|
* <p>An example of associating additional behavior to this class might be |
|
|
|
|
* realized by extending the class to implement an additional interface. For |
|
|
|
|
* example, one might want to implement a {@link Comparable} so that when the |
|
|
|
|
* {@link DeferredResult} is added to a {@link PriorityQueue} it is handled in |
|
|
|
|
* the correct order. |
|
|
|
|
* |
|
|
|
|
* @author Rossen Stoyanchev |
|
|
|
|
* @author Rob Winch |
|
|
|
|
* @since 3.2 |
|
|
|
|
*/ |
|
|
|
|
public final class DeferredResult<T> { |
|
|
|
|
public class DeferredResult<T> { |
|
|
|
|
|
|
|
|
|
private static final Log logger = LogFactory.getLog(DeferredResult.class); |
|
|
|
|
|
|
|
|
|
@ -88,14 +103,14 @@ public final class DeferredResult<T> {
@@ -88,14 +103,14 @@ public final class DeferredResult<T> {
|
|
|
|
|
* timeout result was provided to the constructor. The request may also |
|
|
|
|
* expire due to a timeout or network error. |
|
|
|
|
*/ |
|
|
|
|
public boolean isSetOrExpired() { |
|
|
|
|
public final boolean isSetOrExpired() { |
|
|
|
|
return ((this.result != RESULT_NONE) || this.expired); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the configured timeout value in milliseconds. |
|
|
|
|
*/ |
|
|
|
|
Long getTimeoutValue() { |
|
|
|
|
final Long getTimeoutValue() { |
|
|
|
|
return this.timeout; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -126,7 +141,7 @@ public final class DeferredResult<T> {
@@ -126,7 +141,7 @@ public final class DeferredResult<T> {
|
|
|
|
|
* @param resultHandler the handler |
|
|
|
|
* @see {@link DeferredResultProcessingInterceptor} |
|
|
|
|
*/ |
|
|
|
|
public void setResultHandler(DeferredResultHandler resultHandler) { |
|
|
|
|
public final void setResultHandler(DeferredResultHandler resultHandler) { |
|
|
|
|
Assert.notNull(resultHandler, "DeferredResultHandler is required"); |
|
|
|
|
synchronized (this) { |
|
|
|
|
this.resultHandler = resultHandler; |
|
|
|
|
@ -179,7 +194,7 @@ public final class DeferredResult<T> {
@@ -179,7 +194,7 @@ public final class DeferredResult<T> {
|
|
|
|
|
return setResultInternal(result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
DeferredResultProcessingInterceptor getInterceptor() { |
|
|
|
|
final DeferredResultProcessingInterceptor getInterceptor() { |
|
|
|
|
return new DeferredResultProcessingInterceptorAdapter() { |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|