From 2553fb8ba1cef72d594032149befd02a56300f8a Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 18 Aug 2014 11:12:07 +0200 Subject: [PATCH] Apply ListenableFuture support to AspectJ Prior to this commit, only @Async annotated methods with proxy style had an explicit support for ListenableFuture. This commit brings that support to AspectJ as well. Issue: SPR-12092 --- .../aspectj/AbstractAsyncExecutionAspect.aj | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/spring-aspects/src/main/java/org/springframework/scheduling/aspectj/AbstractAsyncExecutionAspect.aj b/spring-aspects/src/main/java/org/springframework/scheduling/aspectj/AbstractAsyncExecutionAspect.aj index 2f2455367e1..1df256e59e2 100644 --- a/spring-aspects/src/main/java/org/springframework/scheduling/aspectj/AbstractAsyncExecutionAspect.aj +++ b/spring-aspects/src/main/java/org/springframework/scheduling/aspectj/AbstractAsyncExecutionAspect.aj @@ -23,7 +23,9 @@ import java.util.concurrent.Future; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.aop.interceptor.AsyncExecutionAspectSupport; +import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.util.concurrent.ListenableFuture; /** * Abstract aspect that routes selected methods asynchronously. @@ -75,11 +77,16 @@ public abstract aspect AbstractAsyncExecutionAspect extends AsyncExecutionAspect } return null; }}; - Future result = executor.submit(callable); - if (Future.class.isAssignableFrom(methodSignature.getReturnType())) { - return result; + + Class returnType = methodSignature.getReturnType(); + if (ListenableFuture.class.isAssignableFrom(returnType)) { + return ((AsyncListenableTaskExecutor) executor).submitListenable(callable); + } + else if (Future.class.isAssignableFrom(returnType)) { + return executor.submit(callable); } else { + executor.submit(callable); return null; } }