关于这段代码我有几个问题:
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 here .它更冗长。你好吗?
由于数据库中的并行写入,这会导致乐观锁异常。 我应该将调用封装在彼此中吗?
谢谢
最佳答案
如果在两次调用完成后保存对象更新,则可以完全避免锁定问题。因此,您可以像这样使用 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(...);
}
});
}
如果您需要依赖第一次调用的信息来进行第二次调用,您可以将 promise 链接在一起,如 return promise1.flatMap(){ return promise2.map { object.save()}}
不要忘记添加恢复功能,以防您的调用失败。
有关完整示例,请查看 https://www.playframework.com/documentation/2.4.x/JavaWS ,如果您使用的是旧版本的游戏,只需将 2.4.x 替换为您的版本前缀即可。
关于web-services - 玩!框架异步调用修改数据库的相同对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25289981/