26
26
import org .springframework .web .context .request .NativeWebRequest ;
27
27
28
28
/**
29
- * {@code DeferredResult} provides an alternative to using a {@link Callable}
30
- * for asynchronous request processing. While a {@code Callable} is executed
31
- * concurrently on behalf of the application, with a {@code DeferredResult} the
32
- * application can produce the result from a thread of its choice.
29
+ * {@code DeferredResult} provides an alternative to using a {@link Callable} for
30
+ * asynchronous request processing. While a {@code Callable} is executed concurrently
31
+ * on behalf of the application, with a {@code DeferredResult} the application can
32
+ * produce the result from a thread of its choice.
33
33
*
34
- * <p>Subclasses can extend this class to easily associate additional data or
35
- * behavior with the {@link DeferredResult}. For example, one might want to
36
- * associate the user used to create the {@link DeferredResult} by extending the
37
- * class and adding an additional property for the user. In this way, the user
38
- * could easily be accessed later without the need to use a data structure to do
39
- * the mapping.
34
+ * <p>Subclasses can extend this class to easily associate additional data or behavior
35
+ * with the {@link DeferredResult}. For example, one might want to associate the user
36
+ * used to create the {@link DeferredResult} by extending the class and adding an
37
+ * additional property for the user. In this way, the user could easily be accessed
38
+ * later without the need to use a data structure to do the mapping.
40
39
*
41
- * <p>An example of associating additional behavior to this class might be
42
- * realized by extending the class to implement an additional interface. For
43
- * example, one might want to implement {@link Comparable} so that when the
44
- * {@link DeferredResult} is added to a {@link PriorityQueue} it is handled in
45
- * the correct order.
40
+ * <p>An example of associating additional behavior to this class might be realized
41
+ * by extending the class to implement an additional interface. For example, one
42
+ * might want to implement {@link Comparable} so that when the {@link DeferredResult}
43
+ * is added to a {@link PriorityQueue} it is handled in the correct order.
46
44
*
47
45
* @author Rossen Stoyanchev
48
46
* @author Rob Winch
49
47
* @since 3.2
50
48
*/
51
49
public class DeferredResult <T > {
52
50
53
- private static final Log logger = LogFactory .getLog (DeferredResult .class );
54
-
55
51
private static final Object RESULT_NONE = new Object ();
56
52
53
+ private static final Log logger = LogFactory .getLog (DeferredResult .class );
54
+
57
55
58
56
private final Long timeout ;
59
57
@@ -91,7 +89,7 @@ public DeferredResult(Long timeout) {
91
89
/**
92
90
* Create a DeferredResult with a timeout value and a default result to use
93
91
* in case of timeout.
94
- * @param timeout timeout value in milliseconds; ignored if {@code null}
92
+ * @param timeout timeout value in milliseconds ( ignored if {@code null})
95
93
* @param timeoutResult the result to use
96
94
*/
97
95
public DeferredResult (Long timeout , Object timeoutResult ) {
@@ -114,6 +112,7 @@ public final boolean isSetOrExpired() {
114
112
115
113
/**
116
114
* Return {@code true} if the DeferredResult has been set.
115
+ * @since 4.0
117
116
*/
118
117
public boolean hasResult () {
119
118
return (this .result != RESULT_NONE );
@@ -123,6 +122,7 @@ public boolean hasResult() {
123
122
* Return the result, or {@code null} if the result wasn't set. Since the result
124
123
* can also be {@code null}, it is recommended to use {@link #hasResult()} first
125
124
* to check if there is a result prior to calling this method.
125
+ * @since 4.0
126
126
*/
127
127
public Object getResult () {
128
128
Object resultToCheck = this .result ;
@@ -137,22 +137,21 @@ final Long getTimeoutValue() {
137
137
}
138
138
139
139
/**
140
- * Register code to invoke when the async request times out. This method is
141
- * called from a container thread when an async request times out before the
142
- * {@code DeferredResult} has been set. It may invoke
143
- * {@link DeferredResult#setResult(Object) setResult} or
144
- * {@link DeferredResult#setErrorResult(Object) setErrorResult} to resume
145
- * processing.
140
+ * Register code to invoke when the async request times out.
141
+ * <p>This method is called from a container thread when an async request
142
+ * times out before the {@code DeferredResult} has been populated.
143
+ * It may invoke {@link DeferredResult#setResult setResult} or
144
+ * {@link DeferredResult#setErrorResult setErrorResult} to resume processing.
146
145
*/
147
146
public void onTimeout (Runnable callback ) {
148
147
this .timeoutCallback = callback ;
149
148
}
150
149
151
150
/**
152
- * Register code to invoke when the async request completes. This method is
153
- * called from a container thread when an async request completed for any
154
- * reason including timeout and network error. This method is useful for
155
- * detecting that a {@code DeferredResult} instance is no longer usable.
151
+ * Register code to invoke when the async request completes.
152
+ * <p>This method is called from a container thread when an async request
153
+ * completed for any reason including timeout and network error. This is useful
154
+ * for detecting that a {@code DeferredResult} instance is no longer usable.
156
155
*/
157
156
public void onCompletion (Runnable callback ) {
158
157
this .completionCallback = callback ;
@@ -181,8 +180,8 @@ public final void setResultHandler(DeferredResultHandler resultHandler) {
181
180
/**
182
181
* Set the value for the DeferredResult and handle it.
183
182
* @param result the value to set
184
- * @return "true" if the result was set and passed on for handling; "false"
185
- * if the result was already set or the async request expired.
183
+ * @return "true" if the result was set and passed on for handling;
184
+ * "false" if the result was already set or the async request expired
186
185
* @see #isSetOrExpired()
187
186
*/
188
187
public boolean setResult (T result ) {
@@ -203,13 +202,12 @@ private boolean setResultInternal(Object result) {
203
202
}
204
203
205
204
/**
206
- * Set an error value for the {@link DeferredResult} and handle it. The value
207
- * may be an {@link Exception} or {@link Throwable} in which case it will be
208
- * processed as if a handler raised the exception.
205
+ * Set an error value for the {@link DeferredResult} and handle it.
206
+ * The value may be an {@link Exception} or {@link Throwable} in which case
207
+ * it will be processed as if a handler raised the exception.
209
208
* @param result the error result value
210
209
* @return "true" if the result was set to the error value and passed on for
211
- * handling; "false" if the result was already set or the async request
212
- * expired.
210
+ * handling; "false" if the result was already set or the async request expired
213
211
* @see #isSetOrExpired()
214
212
*/
215
213
public boolean setErrorResult (Object result ) {
0 commit comments