如何使用Spring AsyncResult和Future Return

5
我有一个公共接口Synchronous,暴露给几个服务层类。它的目的是基于传递的id查找对象图,执行一些业务逻辑,然后将其传递给Spring异步方法Asynchronous.doWork完成其余任务。
我试图使用Spring AsyncResult,但不确定返回的WorkResult对象实际上会返回到哪里。 我需要在SynchronousImpl中的某个地方放置处理程序吗? 有什么想法吗?
同步公共服务:
public class SynchronousImpl implements Synchronous {
    private Asynchronous async;
    //business logic
    public void doWork(long id){
        async.doWork(id);
    }
}

异步工作者类:
public class Asynchronous {
    @Async
    public Future<WorkResult> doWork(long id){
        //business logic
        WorkResult result = new WorkResult(id, "Finished");
        return new AsyncResult<WorkResult>(result);
    }
}
1个回答

8
一个 Future 和 Spring 没有任何关系,Future 是属于 Java 6 并发框架的类。
一个典型的使用情况是这样的:
public void doWork(long id) {
    Future<WorkResult> futureResult = async.doWork(id);
    //Do other things.
    WorkResult result = futureResult.get(); //The invocation will block until the result is calculated.
}

在异步方法启动后(这就是Spring通过其@Async注解帮助的地方),调用者立即获得Future对象。但是,future对象不是结果,它只是真正结果的包装器/占位符/代理/引用。

现在,调用者和工作线程并行运行,并且可以执行不同的任务。当调用者调用futureResult.get();并且真正的结果尚未计算出来时,此线程会被阻塞,直到工作线程提供结果。(当调用者调用futureResult.get();并且真正的结果已经计算出来时,他将立即获得结果)


1
那么这会阻塞同步线程并保持它直到异步线程完成,对吗? - c12
1
从Spring 4.1开始(还包括Java8?),AsyncResult类附带了更好的东西 - 现在可以附加回调处理程序,而不是阻塞。 - demaniak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接