我有一个模型,我想填充Web服务的详细信息.我想异步这样做,以免阻塞服务器线程.我们假装它是一个登录服务.
现在我想要做的是向远程服务器发出请求并最终返回User模型对象.所以方法签名看起来像这样:
public static User loginUser(String username,String password) {
我理解为了对Web服务进行异步调用,我应该使用Promise:
Promise wsPromise = WS.url("http://myserver.com/login")
.setContentType("application/json; charset=utf-8")
.post("... the username and password ...");
哪个还没有启动请求.我可以在这个对象上调用get()来对服务进行阻塞调用.这有效.
为了异步执行此操作,我认为我需要映射它并以某种方式执行它.
Promise resultPromise = wsPromise.map(new F.Function() {
@Override
public User apply(WS.Response response) throws Throwable {
System.out.println(response.getBody());
return new User(... based on something extracted from the returned JSON ...);
}
});
现在我该如何触发此操作?如果我在resultPromise上调用get(),它会调用但最终会触发Timeout Exception.我不能使用async(…)方法,因为它只返回一个Result.
实际上,这些示例似乎调用Web服务,将JSON结果映射到对象,然后立即将它们映射回相同的JSON.当我想将User(在我的情况下)传递回调用函数时,没什么用处.
说实话,我对这种异步性质有点困惑(你可能已经猜到了).特别是,这实际上是一个阻止操作,因为我们必须等待Web服务返回响应.文档似乎表明使用Promise / Future模式将避免这种阻塞.
底线是:如何在不阻止Play Framework服务器中的线程的情况下将Web服务调用的结果映射回模型对象?
随意滥用我对Play Framework缺乏经验…