Java – Spring 3: How to call @Async annotated methods from the TaskExecutor

asynchronousjavamultithreadingspringspring-mvc

I'm new to asynchronous task execution in Spring, so please forgive me if this sounds like a silly question.

I read that @Async annotation is introduced from Spring 3.x onward at method level to invocation of that method will occur asynchronously.
I also read that we can configure the ThreadPoolTaskExecutor in the spring config file.

What I'm not able to understand is that how to call a @Async annotated method from a tak executor lets suppose – AsyncTaskExecutor

Earlier we used to do something like in a class:

@Autowired protected AsyncTaskExecutor executor;

And then

executor.submit(<Some Runnable or Callable task>)

I'm not able to understand the relationship between @Async annotated methods and TaskExecutor.

I tried searching a lot over the internet but could not get anything on this.

Can somebody provide an example for the same.

Best Answer

Here's an example of @Async use:

@Async
void doSomething() {
    // this will be executed asynchronously
}

Now call that method from another class and it will run asynchronously. If you want a return value use a Future

@Async
Future<String> returnSomething(int i) {
    // this will be executed asynchronously
}

The relationship between @Async and TaskExecutor is that @Async uses a TaskExecutor behind the scenes. From the docs:

By default when specifying @Async on a method, the executor that will be used is the one supplied to the 'annotation-driven' element as described above. However, the value attribute of the @Async annotation can be used when needing to indicate that an executor other than the default should be used when executing a given method.

So to set up a default executor, add this to your spring config

<task:annotation-driven executor="myExecutor" />

Or to use a particular executor for a single use try

@Async("otherExecutor")

See http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-annotation-support-async