public abstract class AsyncExecutionAspectSupport extends java.lang.Object implements BeanFactoryAware
org.springframework.scheduling.annotation.AnnotationAsyncExecutionInterceptor
or org.springframework.scheduling.aspectj.AnnotationAsyncExecutionAspect
.
Provides support for executor qualification on a method-by-method basis.
AsyncExecutionAspectSupport
objects must be constructed with a default Executor
, but each individual method may further qualify a specific Executor
bean to be used when executing it, e.g. through an annotation attribute.
Modifier and Type | Field and Description |
---|---|
static java.lang.String |
DEFAULT_TASK_EXECUTOR_BEAN_NAME
The default name of the
TaskExecutor bean to pick up: "taskExecutor". |
protected Log |
logger |
Constructor and Description |
---|
AsyncExecutionAspectSupport(java.util.concurrent.Executor defaultExecutor)
Create a new instance with a default
AsyncUncaughtExceptionHandler . |
AsyncExecutionAspectSupport(java.util.concurrent.Executor defaultExecutor,
AsyncUncaughtExceptionHandler exceptionHandler)
Create a new
AsyncExecutionAspectSupport with the given exception handler. |
Modifier and Type | Method and Description |
---|---|
protected AsyncTaskExecutor |
determineAsyncExecutor(java.lang.reflect.Method method)
Determine the specific executor to use when executing the given method.
|
protected java.lang.Object |
doSubmit(java.util.concurrent.Callable<java.lang.Object> task,
AsyncTaskExecutor executor,
java.lang.Class<?> returnType)
Delegate for actually executing the given task with the chosen executor.
|
protected java.util.concurrent.Executor |
findQualifiedExecutor(BeanFactory beanFactory,
java.lang.String qualifier)
Retrieve a target executor for the given qualifier.
|
protected java.util.concurrent.Executor |
getDefaultExecutor(BeanFactory beanFactory)
Retrieve or build a default executor for this advice instance.
|
protected abstract java.lang.String |
getExecutorQualifier(java.lang.reflect.Method method)
Return the qualifier or bean name of the executor to be used when executing the
given async method, typically specified in the form of an annotation attribute.
|
protected void |
handleError(java.lang.Throwable ex,
java.lang.reflect.Method method,
java.lang.Object... params)
Handles a fatal error thrown while asynchronously invoking the specified
Method . |
void |
setBeanFactory(BeanFactory beanFactory)
Set the
BeanFactory to be used when looking up executors by qualifier
or when relying on the default executor lookup algorithm. |
void |
setExceptionHandler(AsyncUncaughtExceptionHandler exceptionHandler)
Supply the
AsyncUncaughtExceptionHandler to use to handle exceptions
thrown by invoking asynchronous methods with a void return type. |
void |
setExecutor(java.util.concurrent.Executor defaultExecutor)
Supply the executor to be used when executing async methods.
|
public static final java.lang.String DEFAULT_TASK_EXECUTOR_BEAN_NAME
TaskExecutor
bean to pick up: "taskExecutor".
Note that the initial lookup happens by type; this is just the fallback in case of multiple executor beans found in the context.
protected final Log logger
public AsyncExecutionAspectSupport(@Nullable java.util.concurrent.Executor defaultExecutor)
AsyncUncaughtExceptionHandler
.defaultExecutor
- the Executor
(typically a Spring AsyncTaskExecutor
or ExecutorService
) to delegate to, unless a more specific
executor has been requested via a qualifier on the async method, in which case the
executor will be looked up at invocation time against the enclosing bean factorypublic AsyncExecutionAspectSupport(@Nullable java.util.concurrent.Executor defaultExecutor, AsyncUncaughtExceptionHandler exceptionHandler)
AsyncExecutionAspectSupport
with the given exception handler.defaultExecutor
- the Executor
(typically a Spring AsyncTaskExecutor
or ExecutorService
) to delegate to, unless a more specific
executor has been requested via a qualifier on the async method, in which case the
executor will be looked up at invocation time against the enclosing bean factoryexceptionHandler
- the AsyncUncaughtExceptionHandler
to usepublic void setExecutor(java.util.concurrent.Executor defaultExecutor)
defaultExecutor
- the Executor
(typically a Spring AsyncTaskExecutor
or ExecutorService
) to delegate to, unless a more specific
executor has been requested via a qualifier on the async method, in which case the
executor will be looked up at invocation time against the enclosing bean factorygetExecutorQualifier(Method)
,
setBeanFactory(BeanFactory)
,
getDefaultExecutor(BeanFactory)
public void setExceptionHandler(AsyncUncaughtExceptionHandler exceptionHandler)
AsyncUncaughtExceptionHandler
to use to handle exceptions
thrown by invoking asynchronous methods with a void
return type.public void setBeanFactory(BeanFactory beanFactory)
BeanFactory
to be used when looking up executors by qualifier
or when relying on the default executor lookup algorithm.setBeanFactory
in interface BeanFactoryAware
beanFactory
- owning BeanFactory (never null
).
The bean can immediately call methods on the factory.findQualifiedExecutor(BeanFactory, String)
,
getDefaultExecutor(BeanFactory)
@Nullable protected AsyncTaskExecutor determineAsyncExecutor(java.lang.reflect.Method method)
AsyncListenableTaskExecutor
implementation.null
, but just if no default executor is available)@Nullable protected abstract java.lang.String getExecutorQualifier(java.lang.reflect.Method method)
null
indicates that no specific executor has
been specified and that the default executor
should be used.method
- the method to inspect for executor qualifier metadatanull
determineAsyncExecutor(Method)
,
findQualifiedExecutor(BeanFactory, String)
@Nullable protected java.util.concurrent.Executor findQualifiedExecutor(@Nullable BeanFactory beanFactory, java.lang.String qualifier)
qualifier
- the qualifier to resolvenull
if none availablegetExecutorQualifier(Method)
@Nullable protected java.util.concurrent.Executor getDefaultExecutor(@Nullable BeanFactory beanFactory)
The default implementation searches for a unique TaskExecutor
bean
in the context, or for an Executor
bean named "taskExecutor" otherwise.
If neither of the two is resolvable, this implementation will return null
.
beanFactory
- the BeanFactory to use for a default executor lookupnull
if none availablefindQualifiedExecutor(BeanFactory, String)
,
DEFAULT_TASK_EXECUTOR_BEAN_NAME
@Nullable protected java.lang.Object doSubmit(java.util.concurrent.Callable<java.lang.Object> task, AsyncTaskExecutor executor, java.lang.Class<?> returnType)
task
- the task to executeexecutor
- the chosen executorreturnType
- the declared return type (potentially a Future
variant)Future
handle)protected void handleError(java.lang.Throwable ex, java.lang.reflect.Method method, java.lang.Object... params) throws java.lang.Exception
Method
.
If the return type of the method is a Future
object, the original
exception can be propagated by just throwing it at the higher level. However,
for all other cases, the exception will not be transmitted back to the client.
In that later case, the current AsyncUncaughtExceptionHandler
will be
used to manage such exception.
ex
- the exception to handlemethod
- the method that was invokedparams
- the parameters used to invoke the methodjava.lang.Exception