lambda - 使用CompletionStage返回结果

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

我是框架和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())));
}

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

我也尝试过类似的事情

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

但这会导致编译错误。

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

谢谢大家。

最佳答案

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

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

关于lambda - 使用CompletionStage返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36788937/

相关文章:

c# - 何时不使用 lambda 表达式

twitter-bootstrap - 游戏框架中的 Bootstrap 字形图标

java - 如何并行运行一组任务并等到所有任务都用 java concurrency utils 完成?

java - 如何仅检测用户在 EditText 中的输入?

c# - 在C#中使用Lambda确定非相等属性值

c# - 仅使用类型的类型制作编译的构造函数表达式

c++ - 理解嵌套的 lambda 表达式

java - 如何在 Play 2.1.1 中伪造 json post 请求

mysql - 通过 Play 使用 ScalaAnorm 访问多个数据库

java多线程应用程序: thread. sleep(100)几乎永远花费