2017-08-11 1 views
0

Wir verwenden Akka mit Java, wenn Forward in einem ask Callback verwenden wir keine Antwort jedoch bei der Verwendung tell stattdessen funktioniert es ganz gut. Was ist der Unterschied?Java - Forward innerhalb Akka Schauspieler in fragen Rückruf

final Message message = Message.builder().build(); 
final ActorRef sender = getSender(); 
final ActorContext context = getContext(); 

PatternsCS.ask(actor, Command.builder().build(), 
     Timeout.durationToTimeout(Duration.create(5, TimeUnit.SECONDS))).thenAccept(result -> { 

    // do something with result 
    ... 

    // 1: Does not work 
    actor.forward(message, context); 
    // 2: Does work 
    actor.tell(message, sender); 

}); 

Auf dem Empfang Schauspieler, wenn getender() im ersten Fall rufen wertet zum DeadLetterActorRef im zweiten Fall es in ActorRef zu dem übergebenen auswertet.

Warum funktioniert forward hier nicht? Was ist der Unterschied zu tell(message, sender)?

Antwort

0

Sie können context nur während der Ausführung "innerhalb eines Aktors" verwenden, d. H. Nur während der Verarbeitung einer Nachricht in receive oder in einem der Lebenszyklusrückrufe.

Wenn Sie es innerhalb von thenAccept verwenden, wird es unabhängig vom Actor in einem anderen Thread ausgeführt, auch wenn der Code innerhalb der Actor-Klasse syntaktisch definiert ist. In diesem anderen Thread ist context nicht gültig.

Ihre Alternative zu tell mit dem ursprünglichen Absender ist der richtige Weg, es zu tun.