使用Spring的Future <entity>和Async annotations

时间:2016-03-01 08:20:22

标签: spring design-patterns asynchronous spring-async

我正在阅读有关如何使用Spring的异步调用的页面: https://spring.io/guides/gs/async-method/

这引出了一些设计问题:

1)你是否隐藏了抽象背后的异步功能,还是直接使用它们?

2)在上面的示例链接中,如果每个Async调用都返回,则代码有一个“while循环”检查每10ms。还有其他方法可以实现这个,然后是一个持续的“while”循环吗? :)感觉效率不高......

谢谢!

2 个答案:

答案 0 :(得分:0)

回答第2个问题:Java Future接口只有两个方法:get()阻止异步请求直到完成; isDone()检查结果是否准备好显示。不幸的是,他们之间没有桥梁 - 你无法收到事件或其他触发通知你,该任务已经计算完毕。

Java 8引入了名为CompletableFuture的机制。

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html

来自docs:

  

可以明确完成的未来(设定其价值和   status),可以用作CompletionStage,支持依赖   完成后触发的功能和动作。

补充教程:http://www.nurkiewicz.com/2013/05/java-8-definitive-guide-to.html

答案 1 :(得分:0)

1)根据我的经验,直接使用异步功能。客户需要知道响应不是立即可用的,因此他们可以利用API等待响应。这导致......

2)轮询。不,它效率不高;但这是处理异步通信的常用方法。另一种方法是回调或基于事件的机制,但我没有看到在ReST API中实现的。

  • 请注意HTTP旨在支持轮询。在异步操作的情况下,服务器将返回202(已接受)。 202响应的主体可能包含指向另一个端点的链接,可以轮询该状态更新。异步处理完成时(或同时为404),状态检查端点将返回303。