Java Spring 3.2@Async任务,返回类型为Future
我正在尝试实现一个spring@Async任务,它的返回类型是Future, 但我真的不知道如何正确地做Java Spring 3.2@Async任务,返回类型为Future,java,spring,asynchronous,Java,Spring,Asynchronous,我正在尝试实现一个spring@Async任务,它的返回类型是Future, 但我真的不知道如何正确地做 这样做我会得到什么?我现在是否可以控制我的任务,以便停止它并运行它 有没有关于我如何做到这一点的参考实现?springsource不提供任何 编辑 从弹簧源和弹簧参考手册: 甚至返回值的方法也可以异步调用。然而,这种方法是必需的 具有未来类型化的返回值。这仍然提供了异步执行的好处,因此 调用方可以在以后调用get()之前执行其他任务 它给出了这样一个例子: @Async Future<
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
@Async
未来回报(int i){
//这将异步执行
}
如何正确实现这一点?ExecutorService可以安排Callable并返回未来的对象。 未来是一个占位符,一旦结果可用,它就包含结果。它允许您检查结果是否存在、取消任务或阻止并等待结果。只有当您期望从任务中获得某些对象/价值时,未来才有用 进行未来通话的正确方法是:
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());
}
Future-futureevenumbernumber=executorService.submit(新的nexteevenumberfinder(10000));
//做点什么。
试一试{
整数nextEventNumber=futureEventNumber.get();
}捕获(执行例外){
System.err.println(“nextEventNumberFinder引发异常:”+e.getCause());
}
下一个EventNumberFinder类:
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;
}
public类nextEventNumberFinder实现可调用{
私有整数;
public-nextEventNumberFinder(整数){this.number=number;}
@凌驾
公共整数调用()引发异常{
对于(;;)
if(isEvenNumber(++number))返回编号;
}
}
Spring集成参考手册:请检查
使用@Async
可以异步运行方法中的计算。这意味着,如果调用了该控件(在Spring管理的bean上),该控件将立即返回给调用方,并且该方法中的代码将在另一个线程中运行。调用者接收绑定到正在运行的计算的Future
对象,并可以使用该对象检查计算是否正在运行和/或等待结果
创建这样一个方法很简单。用@Async
对其进行注释,并将结果包装在AsyncResult
中,如博文所示。查看此内容
重要的配置是:
@Async
默认情况下将使用SimpleSynctAskeExecutor
将响应包装在未来的对象中
例子
@Async
公共未来生成文档(FooBarBean){
//做些逻辑分析
返回新的异步结果(result);
}
然后,您可以使用result.isDone()
检查结果是否完成,或者等待获得响应result.get()
,这意味着如果任务尚未取消,我可以随时停止任务,对吗?@Developer106是的,您可以通过调用返回的Future
来中断异步方法。但这种中断并不是自动发生的。方法应该通过调用线程.isInterrupted()
来检查中断,或者使用抛出中断异常的方法。请参阅Java教程中的。为什么结果必须包装在AsyncResult中?@user1860447,因为如果结果是异步计算的,您需要一种方法来查询结果是否准备就绪,并能够等待它(可能有一个超时)或者取消异步计算。@PetrPudlák,如果我需要异步执行任务,并且需要立即获得taskId
(表示任务注册的字符串,帮助用户跟踪任务进度),如果taskId
必须在用@Async
注释的方法中生成,而不是由调用程序生成,那么如何实现这一点?
@Async
public Future<PublishAndReturnDocumentResult> generateDocument(FooBarBean bean) {
// do some logic
return new AsyncResult<PublishAndReturnDocumentResult>(result);
}