【问题标题】:Using CompletionStage to return results使用 CompletionStage 返回结果
【发布时间】:2016-04-22 08:37:20
【问题描述】:

我是玩框架和 Java8 的新手。我正在尝试在 Play 中编写一个简单的 Web 服务,它符合异步模型并允许 Web 服务调用快速返回,从而为异步线程留下繁重的工作。

我有一个非常基本的操作

public CompletionStage<Result> getPeople() {

}

调用中的真正处理必须从数据库中加载人员数据。 db方法是

List<People> people = dbService.getPeople();
return ok(Json.tojson(people));

dbMethod 本身是异步的并返回 CompletionStage>。

CompletionStage<List<People>> getPeople() {}

所以我的问题是我不明白如何最好地对 Web 服务进行编程以使该方法不会阻塞。

我可以在我的处理程序中做这样的事情

public CompletionStage<Result> getPeople() {
  CompletableFuture.completedFuture(
    ok(Json.toJson(dbservice.getPeople().get())));
}

问题在于控制器在“get”方法处阻塞,并且它抛出异常,除了使用标准 try-catch 块(这也使其非异步)之外,我不知道如何处理。

我也尝试过类似的方法

return CompletableFuture.supplyAsync(() -> {
    return dbService.getPeople();
    }).thenApply(i -> { ok(Json.toJson(i.get())); } );

但这会产生编译错误。

我将非常感谢这里的一些帮助;因为我对 Java 异步编程非常陌生,尽管阅读了很多教程,但我不清楚如何最好地使用这些。

谢谢大家。

【问题讨论】:

  • 您使用的是 Play 2.5.x 吗?使用supplyAsync时编译错误是什么?

标签: lambda playframework-2.0 java.util.concurrent concurrent.futures completable-future


【解决方案1】:

您应该返回您的未来,但将结果转换为 play.mvc.result:

public CompletionStage<Result> getPeople() {
    return dbService.getPeople().thenApply(peopleList -> 
        ok(Json.toJson(peopleList))
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2012-10-17
    • 2017-10-19
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多