Spring 3.2 @Async任务,返回类型为“未来”

2022-09-02 01:03:08

我正在尝试实现一个弹簧@Async任务,该任务具有Future的返回类型,但我无法真正弄清楚如何正确完成它。

  1. 这样做能给我带来什么?我现在可以控制我的任务,以便可以停止并运行它吗?
  2. 是否有任何关于我如何做到这一点的参考实现?弹簧源不提供任何。

编辑

从弹簧源和弹簧折射手册:

即使返回值的方法也可以异步调用。但是,此类方法需要具有 Future 类型化返回值。这仍然提供了异步执行的好处,以便调用方可以在该 Future 上调用 get() 之前执行其他任务。

它给出了这样一个例子:

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

如何正确实现这一点?


答案 1

查看此博客文章

使用允许您在方法中异步运行计算。这意味着,如果调用它(在 Spring 托管 Bean 上),则该控件将立即返回给调用方,并且该方法中的代码将在另一个线程中运行。调用方接收绑定到正在运行的计算的对象,并可以使用它来检查计算是否正在运行和/或等待结果。@AsyncFuture

创建这样的方法很简单。用 注释它并将结果包装在 中,如博客文章中所示。@AsyncAsyncResult


答案 2

查看此博客文章

重要配置是:

  1. @Async在春季管理豆类方法上。
  2. 在 Spring 配置 XML 中启用异步,方法是定义:
<!-- 
    Enables the detection of @Async and @Scheduled annotations
    on any Spring-managed object.
-->
<task:annotation-driven />

默认情况下将使用 SimpleAsyncTaskExecutor。

将响应包装在对象中。Future<>


@Async
public Future<PublishAndReturnDocumentResult> generateDocument(FooBarBean bean) {  
    // do some logic  
    return new AsyncResult<PublishAndReturnDocumentResult>(result);
}

然后,您可以使用 检查结果是否已完成 或 等待获得响应。result.isDone()result.get()


推荐