如何在Play Framework 2.x操作中使用MongoDB异步Java驱动程序?

5
我希望在Play Framework 2项目中使用MongoDB Async Java Driver, MongoDB Async Java Driver返回SingleResponseCallback。 我不知道如何在Play控制器中处理这种类型的结果。
例如,如何在Play控制器中从以下代码返回计数:
collection.count(
 new SingleResultCallback<Long>() {
  @Override
  public void onResult(final Long count, final Throwable t) {
      System.out.println(count);
  }
});

我该如何从SingleResultCallback获取结果,然后将其转换为Promise?这是一个好的方法吗?在这种情况下,最佳实践是什么?
3个回答

2

你必须自己解决这个承诺。请记住,Play 承诺是 scala futures 的包装器,而解决 future 的唯一方法是使用 scala Promises(与 play promises 不同)(我知道,有点令人困惑)。你需要做类似于以下的事情:

Promise<Long> promise = Promise$.MODULE$.apply();
collection.count(
 new SingleResultCallback<Long>() {
   @Override
   public void onResult(final Long count, final Throwable t) {
     promise.success(count);
  }
});
return F.Promise.wrap(promise.future());

Promise$.MODULE$.apply() 这个东西只是从 Java 访问 Scala 对象的一种方式。


谢谢您的回复。它解决了我的问题。我会添加一个新的答案,附上更多细节。 - Saeed Zarinfam

0
一个更简洁的解决方案是使用{{link1:F.RedeemablePromise<A>}}。
public F.Promise<Result> index() {
    F.RedeemablePromise<Long> promise = F.RedeemablePromise.empty();

    collection.count(new SingleResultCallback<Long>() {
        @Override
        public void onResult(final Long count, final Throwable t) {
            promise.success(count);
        }
    });

    return promise.map((Long response) -> ok(response.toString()));
}

0
感谢@caeus的回答,以下是详细内容:
public F.Promise<Result> index() {
    return F.Promise.wrap(calculateCount())
            .map((Long response) -> ok(response.toString()));
}


private Future<Long> calculateCount() {
    Promise<Long> promise = Promise$.MODULE$.apply();

    collection.count(
            new SingleResultCallback<Long>() {
                @Override
                public void onResult(final Long count, final Throwable t) {
                    promise.success(count);
                }
            });

    return promise.future();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接