了解Playframework示例项目

时间:2018-03-22 12:54:20

标签: java playframework akka

我正在研究Playframework概念,我所坚持的是AsyncController示例,其中说明了以下描述:

  

此控制器包含一个演示如何在控制器中编写简单异步代码的操作。 它使用计时器异步延迟发送响应1秒钟。

我在这里用粗体标记有问题的陈述。

这是控制器的代码,我删除了方法的描述,而不是在问题页面上浪费空间。

@Singleton
public class AsyncController extends Controller {

    private final ActorSystem actorSystem;
    private final ExecutionContextExecutor exec;

    @Inject
    public AsyncControllerSO(ActorSystem actorSystem, ExecutionContextExecutor exec) {
      this.actorSystem = actorSystem;
      this.exec = exec;
    }

    public CompletionStage<Result> message() {
        return getFutureMessage(1, TimeUnit.SECONDS).thenApplyAsync(Results::ok, exec);
    }

    private CompletionStage<String> getFutureMessage(long time, TimeUnit timeUnit) {
        CompletableFuture<String> future = new CompletableFuture<>();
        actorSystem.scheduler().scheduleOnce(
            Duration.create(time, timeUnit),
            () -> future.complete("Hi!"),
            exec
        );
        return future;
    }

}

我不明白为什么在PlayFramework中给出异步直觉的例子强调“异步延迟定时器”功能?

根据description of scheduleOnce方法:

  

计划Runnable延迟运行一次,即在执行runnable之前必须经过的时间段

后者是否意味着延迟正在与message()方法运行的同一个线程中执行,因此不能将其视为异步?

1 个答案:

答案 0 :(得分:1)

没有涉及Akka或Play的细节,关于异步延迟的一般想法是它不会阻塞线程,所以其他事情可以同时完成。当您致电.thenApplyAsync时,您正在设置一个回调,该回调将在未来结果准备就绪时执行。因此,调度程序知道该怎么做:安排在1秒内运行未来(如果还有其他事情需要同时执行),一旦未来准备就绪,运行回调。