Java play框架对同一对象的异步操作

时间:2015-03-28 20:55:35

标签: java asynchronous concurrency playframework

我试图在同一个对象上执行异步操作,例如我将List传递给Promise以同时执行3个查询,其中每个查询在完成时向List添加查询结果,最后http结果返回完整列表当所有并发查询结果完成时。

看一下本教程:

https://www.playframework.com/documentation/2.2.x/JavaAsync

我可以做这样的事情

    return async(
            promise(new Function0<Integer>() {
                public Integer apply() {
                    firstQuery();
                }
            })
            . promise(new Function0<Integer>() {
                public Integer apply() {
                    return secondQuery();
                }
            })

            .map(new Function<Integer,Result>() {
                public Result apply(Integer i) {
                    Logger.debug("we have got "+i);
                return ok("Got " + i);
                }
            })     
        );

使两个操作同时工作,但我既不能将一个对象传递给promise,也不能得到两个查询的结果来处理这两个结果。

1 个答案:

答案 0 :(得分:1)

您可以使用Promise.sequence来实现

F.Promise<Integer> one, two;
one = F.Promise.promise(new F.Function0<Integer>() {
    @Override public Integer apply() throws Throwable {
        return 20;
    }
});
two = F.Promise.promise(new F.Function0<Integer>() {
    @Override public Integer apply() throws Throwable {
        return 22;
    }
});
return F.Promise.sequence(one, two).map(new F.Function<List<Integer>, Result>() {
    @Override
    public Result apply(List<Integer> integers) throws Throwable {
        int res = integers.get(0) + integers.get(1);
        return ok("The answer is " + res);
    }
});