【发布时间】:2013-12-11 18:24:39
【问题描述】:
一些 Play Framework 开发人员有 said“永远不要在 Promise 上调用 get(),因为它会导致死锁。”行。
假设我有需要Bar(不是F.Promise<Bar>)的遗留代码,并在下面调用apply(Foo foo) 来获取它。在apply 中,我想做一些并发的网络服务调用,等待响应,然后使用它们来创建Bar。如果不调用futureBar.get(),我怎么能做到这一点,再次假设返回F.Promise<Bar> 不是一个选项?
public class Func implements F.Function<Foo,Bar> {
@Override
public Bar apply(Foo foo) throws Throwable {
F.Promise<WS.Response> response1 = WS.url("http://google.com").get();
F.Promise<WS.Response> response2 = WS.url("http://yahoo.com").get();
F.Promise<List<WS.Response>> responses = F.Promise.sequence(response1, response2);
F.Promise<Bar> futureBar = responses.map(new F.Function<List<WS.Response>, Bar>() {
@Override
public Bar apply(List<WS.Response> o) throws Throwable {
//some code;
return bar;
}
});
//How can I return Bar without calling get?
}
}
【问题讨论】:
-
你回答过这个问题吗?我处于类似的情况,我需要插入的 API 不是基于 Promise 的。
-
我认为唯一的选择是调用
.get(timeout),其中 timeout 是某个 TimeUnit 或重写客户端代码以使用 Promises。
标签: java web-services concurrency playframework-2.0 akka