Play framework 2.4(Java)mongo async db driver 3.0查询

时间:2015-07-23 12:19:25

标签: java mongodb asynchronous playframework

您好我试图使用Play Framework 2.4(Java)在具有异步结果http://mongodb.github.io/mongo-java-driver/3.0/driver-async/的控制器中编写MongoDB异步驱动程序(3.0)https://www.playframework.com/documentation/2.3.x/JavaAsync的异步代码,当我这样做时测试它Promise结果是在MongoDB的Async调用之外,所以有时我在响应中有空的json,请你能帮助我吗?

public F.Promise<Result> list() {
    final List<Document> accounts = new ArrayList<Document>();
    F.Promise<List<Document>> promiseOfAccounts = F.Promise.promise(
        new F.Function0<List<Document>>() {
            public List<Document> apply() {
                accountRepository.getCollection().find().into(accounts,
                        new SingleResultCallback<List<Document>>() {
                            @Override
                            public void onResult(final List<Document> result, final Throwable t) {
                            }
                        });
                return accounts;
            }
        }
    );
    return promiseOfAccounts.map(
        new F.Function<List<Document>, Result>() {
            public Result apply(List<Document> i) {
                return ok(i);
            }
        }
    );
}

1 个答案:

答案 0 :(得分:0)

当你返回accounts时,SigleResultCallback闭包还没有被执行。这导致列表在ok(i)表达式中序列化时为空。为了使其有效,您必须自己在SingleResultCallback内解决承诺。请记住,将游戏Promises放在scala Future和scala Promises(与Play F.Promise s不同)上。这就是你要做的事情:

Promise<List<Document>> accountsPromise = Promise$.MODULE$.apply();
ArrayList<Document> accounts = new ArrayList<Document>();
accountRepository.getCollection().find().into(accounts,
        new SingleResultCallback<List<Document>>() {
            @Override
            public void onResult(final List<Document> result, final Throwable t) {
                accountsPromise.success(result);
            }
        });
promiseOfAccounts=F.Promise.wrap(accountsPromise.future());
return promiseOfAccounts.map(
        new F.Function<List<Document>, Result>() {
            public Result apply(List<Document> i) {
                return ok(i);
            }
        }
);

当你调用scala success的{​​{1}}方法结算时,所以未来的价值变得可用,但在此之前你会返回游戏Promise,这真是太棒了反应式编程。