Home » Java » Enterprise Java » Invoking Async method call using Future object in Spring

About Idan Fridman

Idan Fridman
Idan is Software engineer with experience in Server side technologies. Idan is responsible for various infrastructure models in the software industry(Telecommunications, Finance).

Invoking Async method call using Future object in Spring

The next example will demonstrate an async method call inside the Spring container. Why do we need async method calls? In some cases we don’t really know if replay is expected or when a result supposed to be delivered back. Traditional way In the Java EE world of handling async calls is using Queue/Topic. We could do the same in Spring but if needed a simple async invocation, you could do it easily by following the next steps:

1. Declare Asynchronous Gateway:


<bean id="executionLogicImpl"
 abstract="false" lazy-init="default" autowire="default">

2. declare interface method with return type – Future(Java 5+):

More information on Future object: http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html

public interface ExecutionLogic

 public Future<String> doSomeExecutionLogic(String message);


* As soon as the GatewayProxyFactoryBean notice a return type Future it will switch the method into an async mode by having AsyncTaskExecutor

3. We will create a job channel which will collect all requests and send them asynchronously to another class(ExecutionLogicImpl) in order to process them(some random business logic):

<int:channel id="job1Channel" />

<int:service-activator input-channel="job1Channel" ref="executionLogicImpl" method="doSomeExecutionLogic" />

The class ExecutionLogicImpl:

public class ExecutionLogicImpl
 public String doSomeExecutionLogic(String msg)
 System.out.println("doing long work on message="+msg);

 catch (InterruptedException e)
 // TODO Auto-generated catch block
 return msg + "_completed";



Test class:

import com.test.components.execution_gateway.ExecutionLogic;

public class testExeceution


ExecutionLogic executionLogic;
public String sendMsgToExecutionQueue(String msg)
 Future<String> processedMessage = executionLogic.doSomeExecutionLogic(msg);

String finalResult = "";
 finalResult = " " + processedMessage.get(TIMEOUT, TimeUnit.SECONDS);
 return "1 final result: " + finalResult; // + " " + response;
 catch (ExecutionException e)
 return "1 final result: " + e + finalResult;// + " " + response;
 catch (TimeoutException tex)
 return "1 final result: " + tex + finalResult; // + " " + response;
 catch (Exception ex)
 return "1 final result: " + ex + finalResult;// + " " + response;


* You can enable timeout using the Future object for cases a response will never be returned.

So what’s happening here? We sending input to be executed asynchronously. The sender is waiting for response (asynchronously) as soon as the request finish it’s processing a result will be sent back to the sender.

(0 rating, 0 votes)
You need to be a registered member to rate this.
1 Comment Views Tweet it!
Do you want to know how to develop your skillset to become a Java Rockstar?
Subscribe to our newsletter to start Rocking right now!
To get you started we give you our best selling eBooks for FREE!
1. JPA Mini Book
2. JVM Troubleshooting Guide
3. JUnit Tutorial for Unit Testing
4. Java Annotations Tutorial
5. Java Interview Questions
6. Spring Interview Questions
7. Android UI Design
and many more ....
I agree to the Terms and Privacy Policy
Notify of

This site uses Akismet to reduce spam. Learn how your comment data is processed.

1 Comment
Newest Most Voted
Inline Feedbacks
View all comments
8 years ago

my requirement through webservice polling approach, I have to send 10 reqeusts asynchronously and get responses.
please can me help me