我正在编写管理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();
}
}
答案 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());