2017-10-19 15 views
1

Je suis en train d'écrire des utilitaires qui gèrent CompletionStages et qui ont besoin de programmer une AchèvementStage en utilisant Akka. Existe-t-il un moyen de donner à Akka une AchèvementStage et de lui demander de l'exécuter plus tard?Programmer une AchèvementStage dans Akka

J'utilise généralement des acteurs comme ceci:

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); 

Est-il possible de donner Akka un CompletionStage à courir sans terminer la phase explicitement dans l'acteur comme ceci:

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

Répondre

1

Je pense qu'il est un peu de malentendu de l'API CompletionStage qui se passe ici, l'étape d'achèvement ne fonctionne pas n'importe où, il peut y avoir une logique qui va compléter ce qui tourne sur un thread, et il peut y avoir des callbacks déclenchés à la fin fil.

Voici quelques interactions avec l'échantillon avec un CompletableFuture/CompletionStage qui utilise le répartiteur pour Akka l'exécution réelle:

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());