在Spring中使用Future对象调用Async方法调用

本文展示了在Spring中如何利用Future对象进行异步方法调用。通过声明带有Future返回类型的接口方法和创建任务通道,可以将请求异步发送到其他类进行处理。这种方式适用于那些不需要立即返回结果或可能需要超时控制的场景。
摘要由CSDN通过智能技术生成

下一个示例将演示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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Async方法Spring框架的一种特殊注解,用于实现异步方法调用。通过在方法上添加@Async注解,可以告诉Spring容器该方法应该在单独的线程执行,而不会阻塞当前线程的执行。\[1\] 要使用@Async方法调用,需要按照以下步骤进行操作: 1. 在启动类上添加@EnableAsync注解,以启用异步功能。\[2\] 2. 在需要异步执行的方法上添加@Async注解。这样,当调用方法时,Spring会自动将其放入线程池执行,并返回一个Future对象,用于获取异步方法的执行结果。\[3\] 例如,假设我们有一个名为doSomething的方法需要异步执行,我们可以在方法上添加@Async注解,如下所示: ```java @Async public Future<String> doSomething() { // 异步执行的逻辑 return new AsyncResult<>("异步方法执行结果"); } ``` 在调用doSomething方法时,它将在单独的线程执行,并返回一个Future对象。我们可以使用对象来获取异步方法的执行结果,如下所示: ```java Future<String> futureResult = doSomething(); String result = futureResult.get(); // 获取异步方法的执行结果 ``` 通过使用@Async方法调用,我们可以实现并发执行任务,提高系统的响应性能和吞吐量。同时,它也可以帮助我们处理那些不需要立即返回结果的耗时操作,提高系统的并发处理能力。 #### 引用[.reference_title] - *1* *3* [在Spring使用Future对象调用Async方法调用](https://blog.csdn.net/dnc8371/article/details/106705454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spring使用@Async异步调用方法](https://blog.csdn.net/qq_34178998/article/details/95939425)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值