web-services - 玩!框架异步调用修改数据库的相同对象

标签 web-services postgresql asynchronous akka playframework-2.2

关于这段代码我有几个问题:

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(....);
}
  1. Akka.future 已弃用,我应该按照说明使用 Promise here .它更冗长。你好吗?

  2. 由于数据库中的并行写入,这会导致乐观锁异常。 我应该将调用封装在彼此中吗?

谢谢

最佳答案

如果在两次调用完成后保存对象更新,则可以完全避免锁定问题。因此,您可以像这样使用 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/

相关文章:

javascript - 如何让await等待函数完成?

C# Task.continuewith 依赖于之前的 Task.Result

reactjs - 为什么我们应该避免组件构造函数中的副作用?

php - 在php中获取包含美元字符的PDO结果集

json - Glassfish 生成 JSON 时出错

java - 为什么这些 xml 文件会得到不同的响应?

java - 使用 Camel 从 Web 服务获取数据

macos - PG::ConnectionBad 升级到 Yosemite 和 postgresql 9.4.4

sql - PostgreSQL 中的窗口函数

java - 为什么没有简单的方法来使用 Java 中的 Web 服务?