21

我正在尝试实现一个返回类型为 Future 的 spring @Async 任务,但我真的不知道如何正确地完成它。

  1. 这样做我会得到什么?我现在可以控制我的任务,以便我可以停止它并运行它吗?
  2. 有没有关于我如何做到这一点的参考实现?springsource 不提供任何。

编辑

来自弹簧源和弹簧参考手册:

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

它给出了一个这样的例子:

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

如何正确实施?

4

3 回答 3

27

看看这篇博文

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

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

于 2013-06-22T12:04:49.407 回答
9

看看这篇博文

重要的配置是:

  1. @Async关于 Spring 托管 bean 方法。
  2. 通过定义在 Spring config 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()

于 2014-01-15T00:03:46.723 回答
2

ExecutorService 可以调度 Callable 并返回一个 Future 对象。Future 是一个占位符,一旦可用就包含结果。它允许您检查结果是否存在、取消任务或阻止并等待结果。仅当您期望任务中的某些对象/值时,Future 才有用。

进行 Future 调用的正确方法是:

Future<Integer> futureEvenNumber = executorService.submit(new NextEvenNumberFinder(10000));

// Do something.

try {
   Integer nextEvenNumber = futureEvenNumber.get();
} catch (ExecutionException e) {
   System.err.println("NextEvenNumberFinder threw exception: " + e.getCause());
}

NextEvenNumberFinder 类:

public class NextEvenNumberFinder implements Callable<Integer> {
private int number;

public NextEvenNumberFinder(int number) { this.number = number; }

@Override
public Integer call() throws Exception {
    for (;;)
        if (isEvenNumber(++number)) return number;
}

}

Spring集成参考手册:http ://static.springsource.org/spring-integration/reference/htmlsingle/

于 2013-06-22T11:50:41.790 回答