我对此代码有几个疑问:
public static Result submit() {
final Object object = filledForm.get();
Akka.future(new Callable<Void>() {
public Void call() throws Exception {
WS1...
object.save();
});
Akka.future(new Callable<Void>() {
public Void call() throws Exception {
WS2...
object.save();
});
return ok(....);
}
Akka.future已过时,我应该按照此处的说明使用Promise 。它比较冗长。你好吗 ?
由于数据库中的并行写入,这将导致乐观锁异常。我应该将呼叫相互封装吗?
谢谢
如果在两次调用完成后保存对象更新,则完全避免了锁定问题。因此,您可以使用Promise将呼叫分组在一起,如下所示:
public static Promise<Result> submit() {
final Object object = filledForm.get();
Promise<JsonNode> jsonPromise1 = ws.url("url1").get().map(
new Function<WSResponse, JsonNode>() {
public JsonNode apply(WSResponse response) {
JsonNode json = response.asJson();
return json;
}
}
);
Promise<JsonNode> jsonPromise2 = ws.url("url2").get().map(
new Function<WSResponse, JsonNode>() {
public JsonNode apply(WSResponse response) {
JsonNode json = response.asJson();
return json;
}
}
);
return Promise.sequence(jsonPromise1,jsonPromise2).map(
new Function<WSResponse, Result>() {
public JsonNode apply(List<JsonNode> results) {
//populate object
object.save();
return ok(...);
}
});
}
如果您需要依靠第一个电话的信息来进行第二个电话,可以将诺言链接在一起,例如 return promise1.flatMap(){ return promise2.map { object.save()}}
如果您的通话可能失败,请不要忘记添加恢复功能。
有关完整示例,请访问https://www.playframework.com/documentation/2.4.x/JavaWS,如果您使用的是Play的旧版本,只需将2.4.x替换为版本前缀即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句