diff --git a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java index bf966a84182..5bcfdaabca8 100644 --- a/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java +++ b/spring-web/src/main/java/org/springframework/web/context/request/async/DeferredResult.java @@ -103,6 +103,22 @@ public final class DeferredResult { } } + /** + * A variant of {@link #set(Object)} that absorbs a potential, resulting + * {@link StaleAsyncWebRequestException}. + * @return {@code false} if the outcome was a {@code StaleAsyncWebRequestException} + */ + public boolean trySet(Object result) throws StaleAsyncWebRequestException { + try { + set(result); + return true; + } + catch (StaleAsyncWebRequestException ex) { + // absorb + } + return false; + } + /** * Invoked to complete async processing when a timeout occurs before * {@link #set(Object)} is called. Or if {@link #set(Object)} is already in diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java index 919b296ab68..7f852cf60ea 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestMappingHandlerAdapter.java @@ -388,10 +388,11 @@ public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter i } /** - * Set an AsyncTaskExecutor to use when a controller method returns a Callable. - *

The default is a {@link SimpleAsyncTaskExecutor} - * - * TODO... need a better default + * Set the AsyncTaskExecutor to use when a controller method returns a + * {@code Callable}. + *

The default instance type is a {@link SimpleAsyncTaskExecutor}. + * It's recommended to change that default in production as the simple + * executor does not re-use threads. */ public void setAsyncTaskExecutor(AsyncTaskExecutor taskExecutor) { this.taskExecutor = taskExecutor;