Moved executor null check to AsyncExecutionInterceptor, allowing AbstractAsyncExecutionAspect to fall back to sync execution (as in 3.2.1)

Issue: SPR-10636
This commit is contained in:
Juergen Hoeller 2013-07-24 15:30:18 +02:00
parent 2e4eb9fc10
commit b6c54c3637
2 changed files with 9 additions and 4 deletions

View File

@ -88,7 +88,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware {
/** /**
* Determine the specific executor to use when executing the given method. * Determine the specific executor to use when executing the given method.
* @return the executor to use (never {@code null}) * @return the executor to use (or {@code null}, but just if no default executor has been set)
*/ */
protected AsyncTaskExecutor determineAsyncExecutor(Method method) { protected AsyncTaskExecutor determineAsyncExecutor(Method method) {
AsyncTaskExecutor executor = this.executors.get(method); AsyncTaskExecutor executor = this.executors.get(method);
@ -102,8 +102,7 @@ public abstract class AsyncExecutionAspectSupport implements BeanFactoryAware {
this.beanFactory, Executor.class, qualifier); this.beanFactory, Executor.class, qualifier);
} }
else if (executorToUse == null) { else if (executorToUse == null) {
throw new IllegalStateException("No executor qualifier specified and no default executor set on " + return null;
getClass().getSimpleName() + " either");
} }
executor = (executorToUse instanceof AsyncTaskExecutor ? executor = (executorToUse instanceof AsyncTaskExecutor ?
(AsyncTaskExecutor) executorToUse : new TaskExecutorAdapter(executorToUse)); (AsyncTaskExecutor) executorToUse : new TaskExecutorAdapter(executorToUse));

View File

@ -83,7 +83,13 @@ public class AsyncExecutionInterceptor extends AsyncExecutionAspectSupport
Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass); Method specificMethod = ClassUtils.getMostSpecificMethod(invocation.getMethod(), targetClass);
specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod); specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
Future<?> result = determineAsyncExecutor(specificMethod).submit( AsyncTaskExecutor executor = determineAsyncExecutor(specificMethod);
if (executor == null) {
throw new IllegalStateException(
"No executor specified and no default executor set on AsyncExecutionInterceptor either");
}
Future<?> result = executor.submit(
new Callable<Object>() { new Callable<Object>() {
@Override @Override
public Object call() throws Exception { public Object call() throws Exception {