在Akka安排CompletionStage

时间:2017-10-19 09:41:54

标签: akka

我正在编写管理CompletionStages的实用程序,需要使用Akka安排CompletionStage。有没有办法给Akka一个CompletionStage并要求它稍后运行?

我通常使用这样的演员:

class MyActor extends UntypedActor {
    public void onReceive(Object msg) throws Exception {
        doTheWork();
    }
}

final ActorRef ref = system.actorOf(Props.create(MyActor.class, this));

system.scheduler().schedule(Duration.Zero(), ref, "Test", system.dispatcher(), null);

有没有办法让Akka完成一个CompletionStage,而不是在演员中明确地完成舞台,如下所示:

class MyActor extends UntypedActor {
    public void onReceive(Object msg) throws Exception {
        myStage.toCompletableFuture().get();
    }
}

1 个答案:

答案 0 :(得分:1)

我认为这里有CompletionStage API存在一些误解,完成阶段不会在任何地方运行,可能会有逻辑完成它在某个线程上运行,并且可能存在回调在完成时触发,这些也在某个线程上运行。

以下是使用Akka调度程序进行实际执行的CompletableFuture / CompletionStage的一些示例交互:

final CompletableFuture<Integer> futureInt = new CompletableFuture<>();

// right away but on the Akka default dispatcher
system.dispatcher().execute(() -> {
  futureInt.complete(5);
});

// or later using the Akka scheduler
system.scheduler().scheduleOnce(FiniteDuration.create(5, TimeUnit.SECONDS), () -> {
  futureInt.complete(6);
}, system.dispatcher());


// run some logic _when_ the completion stage is completed
futureInt.thenAcceptAsync((n) -> {
  System.out.println("futureInt completed with value " + n);
}, system.dispatcher());