下一个示例将演示Spring容器内部的异步方法调用。 为什么我们需要异步方法调用? 在某些情况下,我们并不真正知道是否需要重播或何时应返回结果。 传统方式在Java EE的异步处理世界中,使用队列/主题。 我们可以在Spring中进行相同的操作,但是如果需要简单的异步调用,则可以按照以下步骤轻松地进行操作:
1.声明
<bean id="executionLogicImpl"
class="com.test.components.execution_gateway.ExecutionLogicImpl"
abstract="false" lazy-init="default" autowire="default">
</bean>
2.声明具有返回类型的接口方法– Future(Java 5+):
有关Future对象的更多信息: http : //docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html
public interface ExecutionLogic
{
public Future<String> doSomeExecutionLogic(String message);
}
*当GatewayProxyFactoryBean注意到返回类型为Future时,它将通过让AsyncTaskExecutor将方法切换到异步模式
3.我们将创建一个作业通道,该通道将收集所有请求并将它们异步发送到另一个类(ExecutionLogicImpl),以便处理它们(一些随机的业务逻辑):
<int:channel id="job1Channel" />
<int:service-activator input-channel="job1Channel" ref="executionLogicImpl" method="doSomeExecutionLogic" />
类ExecutionLogicImpl:
public class ExecutionLogicImpl
{
public String doSomeExecutionLogic(String msg)
{
try
{
System.out.println("doing long work on message="+msg);
Thread.sleep(8000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return msg + "_completed";
}
}
测试类别:
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 = "";
try
{
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;
}
}
...
}
*对于永远不会返回响应的情况,可以使用Future对象启用超时。
那么这里发生了什么? 我们发送输入以异步执行。 一旦请求完成处理,发送方将立即等待响应(响应),结果将被发送回发送方。
翻译自: https://www.javacodegeeks.com/2013/06/invoking-async-method-call-using-future-object-in-spring.html